java 正则表达式 X?? 的示例,X?+ 和 X? [复制]

Posted

技术标签:

【中文标题】java 正则表达式 X?? 的示例,X?+ 和 X? [复制]【英文标题】:Example for java regex X?? ,X?+ and X? [duplicate] 【发布时间】:2013-09-17 04:34:03 【问题描述】:

有人可以通过java示例给出X?X?+X??之间的区别。 其中X?X?+X??java.util.regex.Pattern

对于所有三种模式,他们给出了相同的解释(X,一次或根本没有) 参考http://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

我在网上找不到好的例子

注意:今天早上我在这里提出了部分问题:what is the difference between the patterns X? and X?,因为我有更新再次发布它

【问题讨论】:

您可以使用更相关的示例,例如使用aababbabba 并使用模式ab?ab?+ab?? 想了解java api doc中给出的模式基础 德普。我做了一个错误的假设。忽略我之前说的话(现在被核弹了。) 强烈建议您自己尝试正则表达式。有很多免费的在线站点,您可以在其中测试正则表达式以查看 A)它们的作用和 B)调试它们。我个人使用的是regexpal.com 无论如何。文档说他们是 posessive quantifiers,谷歌搜索给了我这个页面,这似乎是一个很好的资源:@​​987654324@ 基本上,他们是贪婪的量词,除了 RE 引擎不会回溯他们。 【参考方案1】:

这是我喜欢的想法 -

X??   Negative bias, 0 or 1 time - preference to 0 if possible

X?    Neutral bias,  0 or 1 time

X?+   Positive bias, 0 or 1 time - preference to 1 if possible,
      and if 1 won't give it up (backtrack)

【讨论】:

+1 方便回答:) 无论如何X? 1 是首选,但更重要的是它也会接受 0 并放弃匹配的部分。 我喜欢将中性视为从左到右处理的基础。在这个模型中,基础只能是贪心的,但这是一个令人困惑的词 IMO,不应强调。 简单易行的感谢 我会说不会放弃回溯,但无论如何。【参考方案2】:

看看这些例子

System.out.println("abb".matches("abb?b"));  // Greedy     -> true
System.out.println("abb".matches("abb??b")); // Reluctant  -> true
System.out.println("abb".matches("abb?+b")); // Possessive -> false

前两个将匹配,因为即使 ? 会贪婪或不情愿,?? 第二个 b 也可以返回并用于匹配未找到此部分的正则表达式的变体。

有趣的事情发生在?+ 中,它是所有格,所以当它匹配某些东西时,这意味着这部分属于正则表达式的所有格部分,不能被正则表达式的其余部分匹配。所以因为第二个bb?+ 匹配,它不能被最后一个b 正则表达式匹配,这就是为什么matches 返回false

【讨论】:

【参考方案3】:

您需要更复杂的模式才能看到差异。

贪婪量词首先尽可能匹配(但回溯)。

不情愿或“非贪婪”量词首先尽可能少匹配。

所有格量词就像贪婪量词一样,但它不会回溯。

使用捕获组查看正在发生的事情。

在字符串bbb 上尝试(b?)(b+)(b??)(b+)(b?+)(b+) 等模式。

如果匹配,则打印 A),如果匹配,则打印 B) 如果匹配,那么组是什么?

以下是我所期望的,但没有测试:

贪婪:它应该在第一种情况下匹配空和b(通过回溯!),在第二种情况下匹配bb

不情愿:它应该匹配第二个中的, `b` in the first case,bb。第一组实际上从不匹配任何东西,所以这种模式没有意义。

占有:它不应该匹配第一个(没有更多的b留给第二组,并且它不会回溯)和第二个字符串中的bb(不需要回溯)。

【讨论】:

以上是关于java 正则表达式 X?? 的示例,X?+ 和 X? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

OS X 上的 sed - 似乎无法在正则表达式中使用 +

常用正则表达式示例

Java 中的正则表达式,\\s 与 \\s+

大家好,帮我理解一下下面的几个java里的正则表达式的意思?在java的Pattern类里出来的

正则表达式

java正则表达式