正则表达式匹配单词,但不匹配html实体

本文关键字:不匹配 html 实体 单词 正则表达式 | 更新日期: 2023-09-27 18:01:41

我正在用正则表达式解析html节点文本,寻找要执行操作的单词。
我用('w+)

我有这样的情况word word和nbsp被识别为一个单词。

我可以匹配的html实体与'&[a-z0-9A-Z]+';,但我不知道如何取消匹配一个词,如果它是实体的一部分。

是否有一种方法,有一个正则表达式匹配一个词,但如果它是一个html实体,如以下?

 
< & lt;
ý & # 253;
等等

正则表达式匹配单词,但不匹配html实体

否定的向后看断言可能会奏效:

(?<!&#?)'b'w+

仅在单词前没有&&#时匹配。但是,它不检查分号,因为分号可能合法地跟在正常单词后面。

宁可先用:

System.Web.HttpUtility.HtmlDecode(...)

System.Net.WebUtility.HtmlDecode(...)

解码将所有转义字符转换为正常表示。用regex解析解码后的HTML

因为你使用的是c#,你可以更进一步,检查完整的
实体形式。

在字边界处使用条件来检查
前分号。如果它在那里,它会使用后视镜来确保
这不是一个实体。

 # @"(?i)('w+)'b(?(?=;)(?<!(?:&|%)(?:[a-z]+|(?:'#(?:[0-9]+|x[0-9a-f]+)))(?=;)))"
 (?i)
 ( 'w+ )                       # (1)
 'b 
 (?(?= ; )                     # Conditional. Is ';' the next character ? 
      (?<!                          # Yes, then this word cannot be part of an entity
           (?: & | % )
           (?:
                [a-z]+ 
             |  (?:
                     '#
                     (?:
                          [0-9]+ 
                       |  x [0-9a-f]+ 
                     )
                )
           )
           (?= ; )
      )
 )
代码:

string input = @"
&nbsp;
&lt; <
&#253; ý
etc etc
I have situations like word&nbsp;word and the nbsp gets recognized as a word.
";
Regex RxNonEntWords = new Regex(@"(?i)('w+)'b(?(?=;)(?<!(?:&|%)(?:[a-z]+|(?:'#(?:[0-9]+|x[0-9a-f]+)))(?=;)))");
Match _m = RxNonEntWords.Match( input );
while (_m.Success)
{
    Console.WriteLine("Found: {1}", _m.Groups[1].Value);
    _m = _m.NextMatch();
}