我主要关心的是 Java 风格,但我也希望获得有关其他方面的信息。
假设您有一个这样的子模式:
(.*)(.*)
虽然不是很有用,但假设这两个捕获组(例如,\1
和 \2
)是与反向引用相匹配的更大模式的一部分这些团体等。
所以两者都是贪婪的,因为他们试图尽可能多地捕获,只有在必要时才减少。
我的问题是:谁更贪婪? \1
是否获得第一优先权,只有在必要时才给予 \2
它的份额?
关于:
(.*)(.*)(.*)
让我们假设 \1
确实获得第一优先权。假设它太贪心了,然后吐出一个字符。谁先得到它?它总是 \2
还是可以是 \3
?
让我们假设 \2
被 \1
拒绝。如果这还不行,现在谁吐出来了?是\2
吐到\3
,还是\1
先吐另一个到\2
?
奖金问题
如果你这样写会发生什么:
(.*)(.*?)(.*)
现在\2
不情愿了。那是不是意味着\1
向\3
吐槽,而\2
只是勉强接受\3
的拒绝?
例子
也许我没有给出具体的例子来展示我是如何使用这些模式的是一个错误,但这里有一些:
System.out.println(
"OhMyGod=MyMyMyOhGodOhGodOhGod"
.replaceAll("^(.*)(.*)(.*)=(\\1|\\2|\\3)+$", "<$1><$2><$3>")
); // prints "<Oh><My><God>"
// same pattern, different input string
System.out.println(
"OhMyGod=OhMyGodOhOhOh"
.replaceAll("^(.*)(.*)(.*)=(\\1|\\2|\\3)+$", "<$1><$2><$3>")
); // prints "<Oh><MyGod><>"
// now \2 is reluctant
System.out.println(
"OhMyGod=OhMyGodOhOhOh"
.replaceAll("^(.*)(.*?)(.*)=(\\1|\\2|\\3)+$", "<$1><$2><$3>")
); // prints "<Oh><><MyGod>"
最佳答案
\1
将具有优先级,\2
和 \3
将始终不匹配任何内容。 \2
将优先于 \3
。
一般规则是这样想的,回溯将仅发生在满足匹配的情况下,它不会发生在满足贪婪的情况下,所以左边是最好的:)
解释回溯和贪婪是我在这里要解决的问题,我建议 friedl's Mastering Regular Expressions
关于java - 正则表达式 : who's greedier?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2565924/