Java 和 .NET 之间的 RegEx“匹配”不同
Posted
技术标签:
【中文标题】Java 和 .NET 之间的 RegEx“匹配”不同【英文标题】:RegEx 'matches' different between Java and .NET 【发布时间】:2012-12-26 06:35:20 【问题描述】:我有在 .NET 中匹配但在 Java 中不匹配的正则表达式。我认为 Java 版本是正确的,所以我想知道如何在 .NET 中复制此功能。
这是模式:
([12AB]?)[: ]*(Mo|Mn|M|Tu|We|Wd|W|Th|Fr|F|Sa|Su)(\w*)[: ]*(\w*)[: ]*(\w*)
这是测试字符串:
D1:AM
这是一个工作示例:RegEx Fiddle
单击 Java 以查看 Java 的结果:
点击 .NET 的结果:
【问题讨论】:
在商业网络上,我看不出问题的症结所在,因为图像来源经常被屏蔽。这对我们俩来说都是一个潜在的问题,我不只是分享这个让其他人嘲笑我的不幸。 Java 显然是 not support conditional expressions。 感谢格兰特,添加了一些文字信息! @PaulRuane 正则表达式中没有条件 您的测试字符串与任一引擎都不匹配(无法满足(Mo|...)
替代),您确定这是您用于上面屏幕截图的实际测试字符串吗?
【参考方案1】:
没有什么不同,只是再次说明您是 Java 错误命名的 .matches()
方法的另一个受害者。正则表达式匹配可以发生在输入的任何地方,如果你想匹配,比如说,只在输入的开头,你必须明确地告诉正则表达式引擎。
如果您再次查看您粘贴的图像,您将看到 Java 的 .find()
返回 true,与 .NET 的 .Match()
相同。 Java 的 .find()
进行真正的正则表达式匹配,.NET 的 .Match()
也是如此。
Java 在这里错误命名.matches()
是错误的,因为它在开头和结尾都锚定了正则表达式(旁注:.lookingAt()
仅在开头锚定)。如果您想在 .NET 中复制该行为,请锚定您的正则表达式:
^([12AB]?)[: ]*(Mo|Mn|M|Tu|We|Wd|W|Th|Fr|F|Sa|Su)(\w*)[: ]*(\w*)[: ]*(\w*)$
(但从您的屏幕截图来看,您似乎使用了 another 正则表达式,而不是您引用的那个:D1:AM
和 D1:PM
都与上面的正则表达式不匹配)
【讨论】:
谢谢,我以为是这样,但我的另一个测试用例失败了,我从中读到了错误的结论。 正则表达式“匹配” - 检查 Java 版本上的 RegEx Fiddle 链接。 查看Java表,它输出了三个方法的结果:matches()
、lookingAt()
和find()
。 .NET 的 Match()
等价于 Java 的 find()
。以上是关于Java 和 .NET 之间的 RegEx“匹配”不同的主要内容,如果未能解决你的问题,请参考以下文章
Impala Regex:匹配字符 a 和 b 之间的字符串(如果 b 存在)
Boost:regex_search - 括号之间的匹配字符串