3

我有在 .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 的结果: Java 正则表达式结果

点击 .NET 的结果: .NET 正则表达式结果

4

1 回答 1

7

.matches()没有什么区别,只是再次说明您是 Java 错误命名方法的另一个受害者。正则表达式匹配可以发生在输入的任何地方,如果你想匹配,比如说,只在输入的开头,你必须明确地告诉正则表达式引擎。

如果您再次查看您粘贴的图像,您将看到.find()Java 返回 true,与.Match().NET 相同。Java.find()进行真正的正则表达式匹配,.NET 的.Match().

Java 在这里是错误命名的.matches(),因为它在开头和结尾都锚定了正则表达式(旁注:.lookingAt()仅在开头锚定)。如果您想在 .NET 中复制该行为,请锚定您的正则表达式:

^([12AB]?)[: ]*(Mo|Mn|M|Tu|We|Wd|W|Th|Fr|F|Sa|Su)(\w*)[: ]*(\w*)[: ]*(\w*)$

(但从您的屏幕截图来看,您似乎使用了另一个正则表达式,而不是您引用的那个:上面的正则表达式既不匹配D1:AM也不D1:PM匹配)

于 2013-01-11T16:23:41.970 回答