【问题标题】:C#/.NET equivalent for Java's Matcher.matches() and Matcher.lookingAt()Java 的 Matcher.matches() 和 Matcher.lookingAt() 的 C#/.NET 等效项
【发布时间】:2012-09-22 18:49:11
【问题描述】:

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

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

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

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

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

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


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

【问题讨论】:

  • 这是一个不同的表达式,它也接受一个 3 位数的输入。 (这意味着 2 到 4 位数字,而不是其中任何一个数字)。另外,问题不在于模式,而只是显示差异的示例。 - 编辑:这是对建议 \d{2,4} 的已删除评论的回复
  • 你不能交换订单吗,即@"^(\d{4}|\d{2})$"

标签: c# .net regex


【解决方案1】:

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

在某种程度上,我更喜欢 Java 的做法,原因有二:

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

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

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

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

【讨论】:

  • 那么你的意思是我需要为不同的检查构建不同的正则表达式实例? (顺便说一句,我完全同意你的命名......当我第一次看到 lookingAt 方法时,我想知道它是什么意思......)
  • 是的,我想这就是我要说的:)
  • 感谢您的回答,我将保持问题开放,看看是否还有其他问题(在将其标记为答案之前)...另外,我记得我检查了 Java 的 @ 实现987654333@ 它也使用锚点。我需要重新检查一下它是如何实现的。
  • 如果我错了,请纠正我,但是使用原始正则表达式并测试 match.Success && match.Length == inputStr.Length 以模仿 Java 的 matches() 方法不是更有效吗?
  • @NightOwl888:我想这取决于上下文。让我们假设正则表达式非常耗时并且匹配字符串中间的某个位置。然后先执行匹配并稍后检查长度肯定会比可以立即找出它在字符串开头不匹配的正则表达式的性能要差得多,例如。
【解决方案2】:

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

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

【讨论】:

  • Regex.IsMatch 如果找到任何匹配项(在输入的任何部分),则返回 true。 Regex.Match 返回匹配的集合。对于我在问题文本中提到的示例,Regex.Match 返回两个匹配项,一个匹配位置 0..2,一个匹配位置 2..4。它永远不会返回整个字符串的匹配项。
  • 嗯,好的。这很简单......只需使用真正的正则表达式!试试这个:\d{2,}
  • 我使用的语法在量词部分:“匹配前一个元素至少 n 次。”
猜你喜欢
  • 1970-01-01
  • 2023-03-23
  • 2011-04-07
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-16
相关资源
最近更新 更多