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+)
如果你想像这样开始分析HTML,那么你可能想真正解析HTML,而不是使用正则表达式。HTML敏捷包是通常的第一个调用端口。使用正则表达式,很难处理像<a></a>foo:123456<a></a>
这样的事情,当然应该去掉中间位,但要编写一个能做到这一点的正则表达式是非常困难的。
我应该补充一点,我假设您实际上有一个HTML块,而不仅仅是单独的短字符串,比如上面的每一行。在一定程度上,我排除了它的可能性,因为如果它是线上唯一的东西,那么匹配它是非常容易的,所以我想如果你想要的话,你会得到它的。:)
Regex通常不是工作的最佳工具,但如果您的案例非常具体,如您的示例中所示,您可以使用:
foo:((?>'d+))(?!</a>)
您的第一个表达式不起作用,因为'd+
会回溯到(?!</a>)
匹配为止。这可以通过不允许'd+
回溯来解决,如上所述,在原子/非回溯组的帮助下,也可以在'd+
回溯的情况下使前瞻失败,例如:
foo:((?>'d+))(?!</a>|'d)
尽管这并没有那么有效。
注意,在内部使用不同的字符串长度时,查找不起作用,您可以用不同的来计算它
例如
- 查找并标记锚点中包含的所有foo-s
- 与所有其他人一起找到并实现你的目标
- 删除标记
这可能是一种冗长的方法,但您可以简单地恢复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