c#regex以匹配特定文本

本文关键字:文本 c#regex | 更新日期: 2023-09-27 18:19:31

我希望匹配HTML锚中不包含的格式为foo:1245的所有文本。例如,我想匹配下面的第1行和第3行:

foo:123456

<a href="http://www.google.com">foo:123456</a>

foo:123456

我尝试过这些正则表达式,但没有成功:

负前瞻尝试(不正确匹配,但不包括最后一位)

foo:('d+)(?!</a>)

非捕获分组的负前瞻

(?:foo:('d+))(?!</a>)

反向查找尝试(似乎不支持通配符)

(?<!<a[^>]>)foo:('d+)

c#regex以匹配特定文本

如果你想像这样开始分析HTML,那么你可能想真正解析HTML,而不是使用正则表达式。HTML敏捷包是通常的第一个调用端口。使用正则表达式,很难处理像<a></a>foo:123456<a></a>这样的事情,当然应该去掉中间位,但要编写一个能做到这一点的正则表达式是非常困难的。

我应该补充一点,我假设您实际上有一个HTML块,而不仅仅是单独的短字符串,比如上面的每一行。在一定程度上,我排除了它的可能性,因为如果它是线上唯一的东西,那么匹配它是非常容易的,所以我想如果你想要的话,你会得到它的。:)

Regex通常不是工作的最佳工具,但如果您的案例非常具体,如您的示例中所示,您可以使用:

foo:((?>'d+))(?!</a>)

您的第一个表达式不起作用,因为'd+会回溯到(?!</a>)匹配为止。这可以通过不允许'd+回溯来解决,如上所述,在原子/非回溯组的帮助下,也可以在'd+回溯的情况下使前瞻失败,例如:

foo:((?>'d+))(?!</a>|'d)

尽管这并没有那么有效。

注意,在内部使用不同的字符串长度时,查找不起作用,您可以用不同的来计算它

例如

  1. 查找并标记锚点中包含的所有foo-s
  2. 与所有其他人一起找到并实现你的目标
  3. 删除标记

这可能是一种冗长的方法,但您可以简单地恢复foo的所有出现:一些数字然后将它们排除在外。。

string pattern = @"foo:'d+ |" +
                 @"foo:'d+[<]";

然后使用匹配收集

 MatchCollection m0 = Regex.Matches(file, pattern, RegexOptions.Singleline);

然后在每次出现时循环:

foreach (Match m in m0)
{
                 . . . exclude the matches that contain the "<"
}

我会使用linq并将html视为xml,例如:var query=MyHtml.Descendants().ToArray();foreach(查询中的XElement结果){

            if (Regex.IsMatch(result.value, @"foo:123456") && result.Name.ToString() != "a")
            {
               //do something...
            }
        }

也许还有更好的方法,但我不知道……这对我来说似乎很直接:p