C#等价的java Matcher.hitEnd()

时间:2013-09-25 11:25:27

标签: c# java regex

C#Regex中是否有等效的java.util.regex.Matcher.hitEnd()

boolean hitEnd()的Javadoc:

  

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

     

@return如果在最后一场比赛中输入结束,则返回true;否则是假的

3 个答案:

答案 0 :(得分:3)

要知道是否已达到终点-

我认为,这与在正则表达式末尾添加(\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

答案 1 :(得分:0)

内置.NET替代

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

替代库

可能可以找到提供所需替代方案的替代库。

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
    
  •   

答案 2 :(得分:-1)

没有

但是自己建造它并不难。

如果使用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)
}