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

Java'的C#/.NET等价物;s Matcher.matches()和Matcher.lookingAt(),c#,.net,regex,C#,.net,Regex,我正在寻找一种方法来确定单个正则表达式是否与整个字符串、字符串的开头或C#中的一部分匹配 在Java中,您可以构造一个Matcher对象,并使用方法matches()检查它是否与整个输入匹配,lookingAt()查看它是否与输入的开头匹配,以及find()查看串中是否有任何匹配 在.NET中,我可以使用Match.Success查看是否存在任何匹配,并检查Match.Index和Match.Length以了解上述条件 问题是,如果找到较小的匹配项,它不会尝试匹配整个输入。例如,如果将输入“12

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

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

在.NET中,我可以使用
Match.Success
查看是否存在任何匹配,并检查
Match.Index
Match.Length
以了解上述条件

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

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

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



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

Regex.Match/Regex.IsMatch?
它返回一个包含子集合的匹配对象

请参见

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

在某种程度上,与Java相比,我更喜欢它,原因有两个:

  • 许多人对
    .matches()
    感到困惑,因为他们不知道它必须匹配整个字符串。关于这个问题,我至少见过十几个问题
  • 为什么在两个不同的地方冗余地保留相同的功能?您已经在正则表达式语法中有了锚,那么为什么要在一些方法中隐式地使用它们(有时命名错误)?(我在和你说话,Python,还有你的
    re.search()
    vs.
    re.match()
    *)
也就是说,这也很容易做到:

  • @“\A(?“
    +原始正则表达式+
    ”)
    -->查找()(现在谁想到了这个名字)
  • @“\A(?“
    +原始正则表达式+
    @”)\z”
    -->
    匹配()


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

这是一个不同的表达式,它也接受3位数的输入。(指2到4位数字之间,而不是其中任何一位)。另外,问题不在于模式,它只是一个例子来说明差异。-编辑:这是对删除的注释的回复,该注释建议\d{2,4}您不能交换顺序吗,即
@“^(\d{4}\d{2})$”
,那么您的意思是我需要为不同的检查构造不同的Regex实例?(顺便说一句,在命名问题上,我完全同意你的观点……当我第一次看到lookingAt方法时,我想知道它是什么意思……)是的,我想这就是我要说的:)谢谢你的回答,我将继续提问,看看是否还有其他问题(在将此标记为答案之前)。。。另外,我记得我检查了Java的
matches()
实现,它也使用了锚。我需要重新检查它是如何实现的。如果我错了,请纠正我,但是如果使用原始正则表达式并测试
match.Success&&match.Length==inputStr.Length
来模拟Java的
matches()
方法,效率不是会更高吗?@NightOwl888:我想这取决于上下文。让我们假设正则表达式是非常耗时的,并且匹配字符串中间的某个位置。然后,首先执行匹配,然后再检查长度肯定比正则表达式性能差得多,例如,正则表达式可以立即发现它在字符串开头不匹配。
regex.IsMatch
如果找到任何匹配项(在输入的任何部分上),则返回true
Regex.Match
返回匹配项的集合。对于我在问题文本中提到的示例,
Regex.Match
返回两个匹配项,一个用于位置0..2,另一个用于位置2..4。它不会返回整个字符串的匹配项。啊,好的。这很简单。。。用一个真正的正则表达式!试试这个:\d{2,}我使用的语法在Quantifiers部分:“至少匹配前一个元素n次。”