在C# Regex中是否有类似于java.util.regex.Matcher.hitEnd()
的等价方法?
boolean hitEnd()
的Javadoc:
如果搜索引擎在此匹配器执行的最后一次匹配操作中达到了输入的末尾,则返回true。当此方法返回true时,更多的输入可能会改变上一次搜索的结果。
@return 如果在最后一次匹配中命中输入末尾,则为true;否则为false
更多关于hitEnd的参考信息。
如何判断是否到达末尾 -
我认为只需要在正则表达式的末尾或者你认为可能匹配到末尾的任何位置添加(\z)?
即可。
这是一种被动检查方式,不会干扰其他构造方式。
以下是C#示例用法:
var str =
"Foo $var1 <br/>Yes\n" +
"......... <br/>\n" +
"......... <br/><br/>\n" +
"Foo $var2 <br/>Yes\n" +
"..........<br/>\n" +
"Yes..........<br/>\n" +
"..........<br/>\n" +
"YesYes";
var rx = new Regex(@"Yes(\z)?");
Match M = rx.Match(str);
while (M.Success)
{
bool bAtEnd = M.Groups[1].Success;
Console.WriteLine("Match = {0} , At end {1}", M.ToString(), bAtEnd);
M = M.NextMatch();
}
输出:
Match = Yes , At end False
Match = Yes , At end False
Match = Yes , At end False
Match = Yes , At end False
Match = Yes , At end True
不。
但是自己构建并不难。
如果使用 Regex.Match(…)
(即匹配一次表达式),则:
bool hitEnd = match.Success && input.Length == (match.Index + match.Length)
如果使用 Regex.Matches(…)
返回 MatchCollection
,则需要最后一个成功的匹配(借助一些Enumerable
帮助)并且可以轻松地成为扩展方法:
static bool HitEnd(this MatchCollection matches, string input) {
if (matches.Count == 0) {
return false; // No matches at all
}
var lastMatch = matches.Cast<Match>().Last();
return input.Length == (lastMatch.Index + lastMatch.Length)
}
hitEnd
:regex =“[0-9]abc”;input =“1ab”
。不匹配,但hitEnd
为真。 - mgukov似乎在System.Text.RegularExpressions
命名空间中没有直接的内置.NET替代方案来替代Java java.util.regex.Matcher.hitEnd()
方法。
可能可以找到提供所需替代方案的替代库。
README.md
),该库支持部分匹配:
<…>
部分匹配:
var regex = new PcreRegex(@"(?<=abc)123");
var match = regex.Match("xyzabc12", PcreMatchOptions.PartialSoft);
// 结果:match.IsPartialMatch == true
stuff_here$
吗? - Simon Whitehead