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
也可以返回并用于匹配未找到此部分的正则表达式的变体。
有趣的事情发生在?+
中,它是所有格,所以当它匹配某些东西时,这意味着这部分属于正则表达式的所有格部分,不能被正则表达式的其余部分匹配。所以因为第二个b
被b?+
匹配,它不能被最后一个b
正则表达式匹配,这就是为什么matches
返回false
。
【讨论】:
【参考方案3】:您需要更复杂的模式才能看到差异。
贪婪量词首先尽可能匹配(但回溯)。
不情愿或“非贪婪”量词首先尽可能少匹配。
所有格量词就像贪婪量词一样,但它不会回溯。
使用捕获组查看正在发生的事情。
在字符串b
和bb
上尝试(b?)(b+)
、(b??)(b+)
、(b?+)(b+)
等模式。
如果匹配,则打印 A),如果匹配,则打印 B) 如果匹配,那么组是什么?
以下是我所期望的,但没有测试:
贪婪:它应该在第一种情况下匹配空和b
(通过回溯!),在第二种情况下匹配b
、b
。
不情愿:它应该匹配第二个中的, `b` in the first case,
、bb
。第一组实际上从不匹配任何东西,所以这种模式没有意义。
占有:它不应该匹配第一个(没有更多的b
留给第二组,并且它不会回溯)和第二个字符串中的b
、b
(不需要回溯)。
【讨论】:
以上是关于java 正则表达式 X?? 的示例,X?+ 和 X? [复制]的主要内容,如果未能解决你的问题,请参考以下文章