如何编写正则表达式选中指定模式以外的全部内容?
正则表达式:匹配除指定HTML块外的所有文本
需求
需要匹配文本中所有不在<ol>...</ol>标签及其内容之外的文本,将非标签块的内容拆分为独立匹配项。
解决方案
使用以下正则表达式(需开启DOTALL模式,让.匹配换行符):
(?s)(?:^|<\/ol>)\s*(.*?)\s*(?=<ol>|$)
正则说明
(?s):启用DOTALL模式,使.可以匹配换行符,适配多行文本场景(?:^|<\/ol>):匹配文本开头或<ol>标签的结束位置,作为目标文本的起始锚点\s*:匹配文本前后的空白字符(若需保留原格式的空白,可移除该部分)(.*?):非贪婪捕获目标文本,直到遇到下一个<ol>标签或文本结尾(?=<ol>|$):正向预查,确保捕获的文本后紧跟<ol>标签或文本结束,避免包含<ol>块内容
匹配结果验证
针对测试文本,该正则会捕获到4个符合预期的匹配项:
- 第一个匹配项:
This is the second paragraph. It contains an ordered list:
- 第二个匹配项:
This is a text after the list in the second paragraph. This is another part of a paragraph
- 第三个匹配项:
This is a text after the other list in the second paragraph. This is a text after the list in the second paragraph. This is another part of a paragraph
- 第四个匹配项:
test to odfjdf iofsdfsoh
原正则失效原因
你之前使用的^.*(<([^>]+?)([^>]*?)>(.*?)<\/\1>)?.*$会匹配整行文本,仅检查行内是否存在目标标签,但仍会将整行(包括标签块)全部选中,无法实现排除<ol>块的效果。
内容的提问来源于stack exchange,提问作者Marcos Costa
相关产品推荐
相关产品推荐

