[英]c# regex to match specific text
我想匹配HTML锚中未包含的所有格式为foo:12345的文本。 例如,我想匹配以下第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 Agility Pack是通常的第一个停靠点。 使用正则表达式很难处理<a></a>foo:123456<a></a>
类的东西,该东西当然应该拉出中间位,但是编写正则表达式将非常困难。
我应该补充一点,我假设你实际上有一块HTML而不是单独的短字符串,例如你上面的每一行。 在某种程度上,我排除了它是因为匹配它是否是唯一容易的事情,所以我认为如果您愿意的话就可以得到它。 :)
正则表达式通常不是工作的最佳工具,但是如果您的案例非常具体,例如您的示例,则可以使用:
foo:((?>\d+))(?!</a>)
你的第一个表达不起作用,因为\\d+
会回溯直到(?!</a>)
匹配。 可以通过不允许\\d+
回溯来解决此问题,如上所述,在atomic / nonbacktracking组的帮助下,也可以在\\d+
回溯的情况下使超前查找失败,例如:
foo:((?>\d+))(?!</a>|\d)
虽然效率不高。
请注意,lookbehind不适用于内部不同的字符串长度,您可以采用其他方式进行计算
例如
这可能是一个漫长的尝试,但是您可以简单地带回所有foo的出现:一些数字,然后再排除它们。
string pattern = @"foo:\d+ |" +
@"foo:\d+[<]";
然后使用matchcollection
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...
}
}
也许有更好的方法,但是我不知道。。。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.