我的主要关注点是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>"