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:AMD1:PM 都与上面的正则表达式不匹配)

【讨论】:

谢谢,我以为是这样,但我的另一个测试用例失败了,我从中读到了错误的结论。 正则表达式“匹配” - 检查 Java 版本上的 RegEx Fiddle 链接。 查看Java表,它输出了三个方法的结果:matches()lookingAt()find()。 .NET 的 Match() 等价于 Java 的 find()

以上是关于Java 和 .NET 之间的 RegEx“匹配”不同的主要内容,如果未能解决你的问题,请参考以下文章

Impala Regex:匹配字符 a 和 b 之间的字符串(如果 b 存在)

模式 ( regex ) 和找到的值之间的相似性

Boost:regex_search - 括号之间的匹配字符串

.NET Regex 是不是支持全局匹配?

Regex / Python3 - re.findall() - 查找操作码之间的所有匹配项

REGEX - 在字符串之间查找文本 - 第一个可选,但在第一个匹配之前只有第二个