java - 正则表达式 : who's greedier?

标签 java regex

我主要关心的是 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/

相关文章:

java - 无法从 IntelliJ 连接到 AWS rekognition API

java - hibernate 加载不加载整棵树

Java正则表达式模式匹配以星号文字结尾的单词

regex - bash中的shell脚本在while循环中使用正则表达式

regex - R-使用通配符替换字符串的一部分

与大写字母相关的Javascript正则表达式无限循环

java - 修饰符 static 只允许在常量变量声明中使用

java - 替换短时间内的多个位

java - 从 RecyclerView 中的 ViewHolder 中删除小部件

python正则表达式: how to remove all punctuation characters from a string but keep those between numbers?