【发布时间】:2011-02-03 16:30:20
【问题描述】:
我主要关心的是 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>"
【问题讨论】: