我有一些正则表达式regex1,regex2...,regexN组合成一个正则表达式regex1|regex2|...|regexN.我想重新排序组件表达式,以便组合表达式在给定字符串的开头给出最长的匹配.
我相信这意味着重新排序正则表达式,"如果regexK匹配前缀regexL,那么L < K".如果这是正确的,通常是否regexK可以找出是否可以匹配前缀regexL?
我试过这个正则表达式:
ab(cd|c)*d
Run Code Online (Sandbox Code Playgroud)
在regex101和RegExr网站上。它完全匹配此文本:
abcdcdd
现在,让我们在正则表达式中交换“ cd”和“ c”:
ab(c|cd)*d
Run Code Online (Sandbox Code Playgroud)
当我在网站上尝试此正则表达式时,我发现此正则表达式与同一文本不完全匹配。
regex引擎为什么不能识别出它们ab(cd|c)*d并且ab(c|cd)*d相同,我该如何说服ab(c|cd)*d匹配最长的字符串?
正则表达式: ab(cd|c)*d
完整文本匹配的13个步骤:abcdcdd
正则表达式: ab(c|cd)*d
分9步匹配部分文本:abcd cdd
嗨,我想特别了解OR运算符"|" 在java正则表达式中工作.我刚开始使用它,大部分事情都不清楚.
假设我希望匹配分数和整数,也就是说1/2,12/25形式的东西,以及形式13,235等的东西.
我试过这两种模式:
pattern1 = Pattern.compile("\\d+|\\d+/\\d+"))
pattern2 = Pattern.compile("\\d+/\\d+|\\d+"))
Run Code Online (Sandbox Code Playgroud)
在英语中,pattern1表示"数字或数字/数字",而pattern2表示"数字/数字或数字".
现在考虑这个输入字符串:
inputStr = "blah... 231/232 blah... 4 blah... 2"
Run Code Online (Sandbox Code Playgroud)
对于pattern1,我发现了这些匹配:
[junit] found 231
[junit] found 232
[junit] found 4
[junit] found 2
Run Code Online (Sandbox Code Playgroud)
对于pattern2,我发现了这些匹配:
[junit] found 231/232
[junit] found 4
[junit] found 2
Run Code Online (Sandbox Code Playgroud)
现在,pattern1和pattern2之间的唯一区别是其匹配元素的顺序.当然,pattern2是我想要的,因为它似乎"更喜欢"一个真正的派系而不是把它们分开.
所以对我来说最重要的问题是:这种行为是可靠的/可预测的,还是对于不同的平台会有所不同?
但也只是好奇......这个问题也是如此:我也觉得它令人困惑,因为运算符"OR"应该与其参数对称,如加法.当1 + 2和2 + 1带有不同的语义时,你会想到人们会担心...这里有什么理由让pattern1和pattern2在语义上有所不同?