【问题标题】:Example for java regex X?? ,X?+ and X? [duplicate]java 正则表达式 X?? 的示例,X?+ 和 X? [复制]
【发布时间】: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 引擎不会回溯他们。

标签: java regex


【解决方案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(不需要回溯)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多