正则表达式匹配单词,但不匹配html实体
本文关键字:不匹配 html 实体 单词 正则表达式 | 更新日期: 2023-09-27 18:01:41
我正在用正则表达式解析html节点文本,寻找要执行操作的单词。
我用('w+)
我有这样的情况word word
和nbsp被识别为一个单词。
我可以匹配的html实体与'&[a-z0-9A-Z]+';
,但我不知道如何取消匹配一个词,如果它是实体的一部分。
是否有一种方法,有一个正则表达式匹配一个词,但如果它是一个html实体,如以下?
<
& lt; ý
& # 253;
等等
否定的向后看断言可能会奏效:
(?<!&#?)'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 = @"
< <
ý ý
etc etc
I have situations like word 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();
}