我正在寻找一种方法来确定单个正则表达式是否与整个字符串、字符串的开头或 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(使用前将#替换为@)