RegEx'匹配'Java和.NET之间的不同

Mar*_*cus 2 .net c# java regex

我有正则表达式,它在.NET中匹配但在Java中不匹配.我认为Java版本是正确的,所以我想知道如何在.NET中复制这个功能.

这是模式:

([12AB]?)[: ]*(Mo|Mn|M|Tu|We|Wd|W|Th|Fr|F|Sa|Su)(\w*)[: ]*(\w*)[: ]*(\w*)
Run Code Online (Sandbox Code Playgroud)

这是测试字符串:

D1:AM
Run Code Online (Sandbox Code Playgroud)

这是一个有效的例子:RegEx Fiddle

单击Java以查看Java的结果: Java Regex结果

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

fge*_*fge 6

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

如果再次查看粘贴的图像,您将看到.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*)$
Run Code Online (Sandbox Code Playgroud)

(但是通过查看截图,看起来你使用了另一个正则表达式而不是你引用的正则表达式:上面的正则表达式既不匹配D1:AM也不D1:PM匹配)