正则表达式:谁更贪婪?
我主要关心的是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>"