5

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

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

在 .NET 中,我可以使用Match.Success来查看是否有任何匹配项,并检查Match.IndexMatch.Length满足上述条件。

问题是,如果找到较小的匹配项,它不会尝试匹配整个输入。例如,如果将输入“1234”呈现给 Regex @"\d{2}|\d{4}",它将匹配前两位数字。

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

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


编辑:问题不在于模式,这只是一个例子来说明我的意思。

4

2 回答 2

3

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

在某种程度上,我更喜欢 Java 所做的事情,原因有两个:

  • 许多人对此感到困惑,.matches()因为他们不知道它必须匹配整个字符串。我已经看到至少十几个关于这个确切问题的问题。
  • 为什么要在两个不同的地方冗余地保留相同的功能?您已经在正则表达式语法中有锚点,那么为什么要让它们隐含在某些(有时是误导性的)方法中呢?(我在和你说话,Python 和你的re.search()vs. re.match()*)。

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

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

* re.match()的行为类似于 Java 的lookingAt(),而不是matches(),如果您想知道的话。

于 2012-09-22T20:38:54.943 回答
0

正则表达式.Match / 正则表达式.IsMatch ?
它返回一个带有子集合的 Match 对象。

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

于 2012-09-22T20:17:58.263 回答