Java的Matcher.matches()和Matcher.lookingAt()的C#/ .NET等价物

时间:2012-09-22 18:49:12

标签: c# .net regex

我正在寻找一种方法来决定一个正则表达式是否匹配整个字符串,字符串的开头或C#中的一部分。

在Java中,您可以构造一个Matcher对象,并使用方法matches()检查它是否与整个输入匹配,lookingAt()以查看它是否与开头匹配输入,find()以查看串联内是否有任何匹配。

在.NET中,我可以使用Match.Success查看是否有匹配项,并针对上述条件选中Match.IndexMatch.Length

问题是,如果找到较小的匹配,它不会尝试匹配整个输入。例如,如果输入“1234”显示给正则表达式@"\d{2}|\d{4}",则它将匹配前两位数字。

在这种情况下,我需要使用模式Regex构建另一个@"^(\d{2}|\d{4})$"来测试整个输入,然后测试另一个以查看它是否与开头匹配。

是不是有办法告诉同一个Regex类更喜欢整个输入匹配,这样我就不需要为此创建(并编译)另一个正则表达式了?


编辑:问题不在于模式,它只是一个展示我的意思的例子。

2 个答案:

答案 0 :(得分:2)

不,在.NET中没有“开头只匹配”或“只匹配整个字符串”的正则表达式方法。您需要使用锚点构建此行为。

在某种程度上,由于两个原因,我比Java更喜欢这个:

  • 很多人都被.matches()弄糊涂了,因为他们不知道它必须匹配整个字符串。关于这个确切的问题,我至少看过十几个问题。
  • 为什么要在两个不同的地方冗余地保留相同的功能?你已经在正则表达式语法中有锚,那么为什么要在一些(有时是误导性命名的)方法中隐含它们呢? (我正在与您,Python和您的re.search()re.match() * )进行通信。

也就是说,它也很容易做到:

  • @"\A(?:" +原始正则表达式+ ")" - > lookingAt()(现在谁想到那个名字)?
  • @"\A(?:" +原始正则表达式+ @")\z" - > matches()

* re.match()的行为与Java的lookingAt()相似,而不像matches(),以防您想知道。

答案 1 :(得分:0)

Regex.Match / Regex.IsMatch?
它返回带有子集合的Match对象。

请参阅http://msdn.microsoft.com/en-us/library/system.text.regularexpressions.regex.match.aspx