C#中类似于Java Matcher.hitEnd()的等效方法是什么?

10

在C# Regex中是否有类似于java.util.regex.Matcher.hitEnd()的等价方法?

boolean hitEnd()的Javadoc:

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

@return 如果在最后一次匹配中命中输入末尾,则为true;否则为false

更多关于hitEnd的参考信息。


这不就相当于 stuff_here$ 吗? - Simon Whitehead
你对这个方法有什么理解? - Vishal Sharma
2
相同的问题,但是在C#中。 - mgukov
2
我猜你必须使用PCRE.Net包,因为该函数来自内置的正则表达式解析器/编译器,而CLR默认解析器缺少它。 - Kamyar
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

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)
}

1
不是这样的。你错了。例如,Java中的hitEndregex =“[0-9]abc”;input =“1ab”。不匹配,但hitEnd为真。 - mgukov
@Michael 如果你对这个失败案例感兴趣...那么要弄清楚它是否可能(这是一个很大的“如果”)会更加困难。 - Richard

0

内置的.NET替代方案

似乎在System.Text.RegularExpressions命名空间中没有直接的内置.NET替代方案来替代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);
    // 结果:match.IsPartialMatch == true
    

部分匹配意味着与结束相同?真的,这与“这是结尾”有什么关系。显然,您不需要使用库来找出这一点。 - user557597
@sln,引用ltrzesniewski/pcre-net: PCRE.NET - Perl Compatible Regular Expressions for .NET:“部分匹配(当主题太短而无法匹配模式时)”。据我所理解,这意味着已经到达主题(输入字符串)的末尾。 - Sergey Vyacheslavovich Brunov
开始思考是否需要另外一个库来比较匹配位置加长度与目标长度,你知道我的意思吗?我的意思是,正则表达式中没有魔法,绝对没有,没有灵丹妙药,这全都是胡说八道和骗人的把戏!一堆虚假和无用的东西。 - user557597

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接