繁体   English   中英

C#正则表达式以匹配特定文本

[英]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不适用于内部不同的字符串长度,您可以采用其他方式进行计算

例如

  1. 查找并标记锚点中包含的所有foo-s
  2. 与其他人一起寻找并达成目标
  3. 去除痕迹

这可能是一个漫长的尝试,但是您可以简单地带回所有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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM