我的正则表达式看起来像
<xxxx location="file path/level1/level2" xxxx some="xxx">
Run Code Online (Sandbox Code Playgroud)
我只对分配给位置的报价部分感兴趣.如果没有贪婪的开关,它不应该像下面那么容易吗?
/.*location="(.*)".*/
Run Code Online (Sandbox Code Playgroud)
似乎没有用.
Dan*_*uis 1001
你需要使你的正则表达式非贪婪,因为默认情况下,"(.*)"
它将匹配所有"file path/level1/level2" xxx some="xxx"
.
相反,你可以使你的点星非贪婪,这将使它尽可能少的字符匹配:
/location="(.*?)"/
Run Code Online (Sandbox Code Playgroud)
添加一个?
量词(?
,*
或+
)会使它变得非贪婪.
sep*_*p2k 48
location="(.*)"
除非你让它变得非贪婪location=
,some="xxx
否则将从"之后直到" 匹配.所以,你要么需要.*?
(即使它非贪婪)或更好的替换.*
用[^"]*
.
小智 29
怎么样
.*location="([^"]*)".*
Run Code Online (Sandbox Code Playgroud)
这样可以避免使用.*进行无限制搜索,并且与第一个引号完全匹配.
这里的其他答案未能阐明不支持非贪婪匹配的正则表达式版本的完整解决方案。贪婪量词(.*?
等.+?
)是 Perl 5 扩展,传统正则表达式不支持它。
如果您的停止条件是单个字符,那么解决方案很简单;代替
a(.*?)b
Run Code Online (Sandbox Code Playgroud)
你可以匹配
a[^ab]*b
Run Code Online (Sandbox Code Playgroud)
即指定不包括开始和结束分隔符的字符类。
在更一般的情况下,您可以精心构造一个表达式,例如
start(|[^e]|e(|[^n]|n(|[^d])))end
Run Code Online (Sandbox Code Playgroud)
捕获start
和 第一次出现之间的匹配end
。请注意带有嵌套括号的子表达式如何拼出许多替代项,这些替代项之间e
仅当后面没有跟随等等时才允许nd
,并且还要注意覆盖空字符串作为一种替代项,该替代项与不允许的内容不匹配那个特定的点。
当然,在大多数情况下,正确的方法是针对您尝试解析的格式使用适当的解析器,但有时,可能没有可用的解析器,或者您使用的专用工具坚持使用正则表达式,但什么都没有别的。