10

java.util.regex.Matcher.hitEnd()在 C# 正则表达式中是否有等价物?

Javadoc 用于boolean hitEnd()

如果在此匹配器执行的最后一次匹配操作中搜索引擎命中输入结尾,则返回 true。当此方法返回 true 时,更多输入可能会改变上次搜索的结果。

@return true 如果在最后一场比赛中输入的结尾被击中;否则为假

更多参考hitEnd

4

3 回答 3

2

要知道是否已经到达终点 -

(\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
于 2019-09-13T21:16:58.613 回答
0

不。

但是自己构建并不难。

如果使用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)
}
于 2013-09-25T12:23:33.147 回答
0

内置 .NET 替代方案

System.Text.RegularExpressionsJavajava.util.regex.Matcher.hitEnd()方法似乎没有直接的内置 .NET 替代方案(在命名空间内)。

替代库

可能会找到一个替代库来提供所需的替代方案。

PCRE.NET

例如,快速搜索发现库:ltrzesniewski/pcre-net: PCRE.NET - Perl Compatible Regular Expressions for .NET。根据其文档 ( README.md),该库支持部分匹配:

示例用法

<…>

  • 部分匹配:

    var regex = new PcreRegex(@"(?<=abc)123");
    var match = regex.Match("xyzabc12", PcreMatchOptions.PartialSoft);
    // result: match.IsPartialMatch == true
    
于 2019-09-13T22:49:11.807 回答