匹配html标记之外的文本

时间:2017-01-12 12:12:19

标签: c# html regex

在有人说之前我知道我应该使用正确的解析器但是对于我的用例,最好使用正则表达式。

我有以下正则表达式尝试匹配html标记之外的文本:

(?<!<[^>]*)(?<Text>.+?)

然而,这似乎与标签的左括号相匹配,即<。我该如何解决这个问题?

示例输入:

<span style="color:blue">some <strong>bold</strong> text</span>

预期:

some bold text

GOT:

<some <bold< text<

Link to RegexStorm.

1 个答案:

答案 0 :(得分:4)

问题是您使用的.匹配任何字符。将其替换为否定的字符类,例如[^<>]匹配除<>之外的任何字符,并使用贪心量词*(以匹配0次或更多次出现)或+(匹配1次或多次出现):

(?<!<[^>]*)(?<Text>[^<>]*)

请参阅regex demo

顺便说一下,在模式结尾处使用(?<Text>.+?)只会使正则表达式引擎匹配1个字符,因为+?是一个惰性量词,匹配1个或多个匹配项,但尽可能少(并且从1开始)就足够了,它总是只匹配1个字符)。通常,在这样一个懒惰的量化之后必须有一些其他模式,否则,它通常不会获取正确的文本。