在有人说之前我知道我应该使用正确的解析器但是对于我的用例,最好使用正则表达式。
我有以下正则表达式尝试匹配html标记之外的文本:
(?<!<[^>]*)(?<Text>.+?)
然而,这似乎与标签的左括号相匹配,即<
。我该如何解决这个问题?
示例输入:
<span style="color:blue">some <strong>bold</strong> text</span>
预期:
some bold text
GOT:
<some <bold< text<
答案 0 :(得分:4)
问题是您使用的.
匹配任何字符。将其替换为否定的字符类,例如[^<>]
匹配除<
和>
之外的任何字符,并使用贪心量词*
(以匹配0次或更多次出现)或+
(匹配1次或多次出现):
(?<!<[^>]*)(?<Text>[^<>]*)
请参阅regex demo
顺便说一下,在模式结尾处使用(?<Text>.+?)
只会使正则表达式引擎匹配1个字符,因为+?
是一个惰性量词,匹配1个或多个匹配项,但尽可能少(并且从1开始)就足够了,它总是只匹配1个字符)。通常,在这样一个懒惰的量化之后必须有一些其他模式,否则,它通常不会获取正确的文本。