C# .NET正则组捕获:如何在SqlTable文本前终止匹配?
解决C#正则中StorePath捕获多余内容的问题
这个问题我之前也碰到过,核心原因是你用的.*是贪婪匹配——它会尽可能多地抓取字符,直到碰到字符串末尾的最后一个双引号,所以才把后面的SqlTable="SqlTableName"也塞进了storePath的捕获组里。
给你两个靠谱的解决方案:
方案1:使用非贪婪匹配模式
把捕获组里的.*改成.*?,让正则尽可能少地匹配字符,碰到第一个双引号就停止。修改后的正则如下:
Defaults(.*)Class="(?<class>.*?)"(.*)StorePath="(?<storePath>.*?)"
方案2:使用更精确的字符匹配(推荐)
因为双引号包裹的内容里不会包含双引号本身,所以可以用[^"]*来替代.*——这个表达式表示“匹配所有非双引号的字符”,不仅不会出现贪婪匹配的问题,性能也比非贪婪模式更好。同时还可以把原来模糊的(.*)换成\s*(匹配任意空白字符),让正则更精准:
Defaults\s*Class="(?<class>[^"]*)"\s*StorePath="(?<storePath>[^"]*)"
用这两种正则去匹配你的目标字符串,都能准确捕获到:
class:Class name herestorePath:Any store path here
完全不会包含后面的SqlTable相关内容。
内容的提问来源于stack exchange,提问作者imnotaduck
相关产品推荐
相关产品推荐

