C#/.NET 相当于 Java 的 Matcher.matches() 和 Matcher.lookingAt()

2024-01-29

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

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

在.NET中,我可以使用Match.Success查看是否有任何匹配,并检查Match.Index and Match.Length对于上述条件。

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

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

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


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


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

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

  • Many人们很困惑.matches()因为他们不知道它必须匹配整个字符串。我已经看到至少有十几个关于这个确切问题的问题。
  • Why keep the same functionality redundantly in two different places? You have anchors in regex grammars already, so why make them implicit in some (sometimes misleadingly-named) methods? (I'm talking to you, Python, and your re.search() vs. re.match()*).

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

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

* re.match() behaves like Java's lookingAt(), not like matches(), in case you were wondering.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C#/.NET 相当于 Java 的 Matcher.matches() 和 Matcher.lookingAt() 的相关文章

随机推荐