如何使用PCRE多行正则表达式提取多行字符串的分段内容?
用PCRE多行正则实现指定文本分割方案
输入文本
Some content here %% some text 1 Some content here 1 %% some text 2 Some content here 2
需求说明
需要将上述文本分割为以下两种结果之一:
结果一
[ "Some content here\n\n", "%% some text 1", "\n\nSome content here 1\n\n", "%% some text 2", "\n\nSome content here 2\n\n" ]
结果二
[ "Some content here\n\n", "%% some text 1\n\nSome content here 1\n\n", "%% some text 2\n\nSome content here 2\n\n" ]
解决方案
两种结果都可以通过PCRE正则实现,核心是启用单行模式((?s),让.匹配换行符),结合正向预查来分割内容:
实现结果一的正则
(?s)(^.*?(?=%%)|%%.*?(?=%%|$))
- 匹配逻辑:
^.*?(?=%%):匹配从文本开头到第一个%%之前的所有内容(包含换行)%%.*?(?=%%|$):匹配从%%开始,到下一个%%或文本结尾的所有内容- 分支
|将两种匹配规则合并,最终得到结果一的分割列表
实现结果二的正则
(?s)(^.*?(?=%%)|%%.*?(?=\n\n%%|$))
- 匹配逻辑:
^.*?(?=%%):同结果一,匹配开头到第一个%%前的内容%%.*?(?=\n\n%%|$):匹配从%%开始,到下一个\n\n%%(空行+%%)或文本结尾的所有内容,这样就把每个%%块及其后续关联内容合并为一个匹配项,对应结果二的分割列表
关于之前尝试的问题
你之前用的(%% .+)加多行模式(m)无法满足需求,是因为多行模式仅改变^和$的匹配范围(匹配行首/行尾),但.+默认不匹配换行符,所以只能匹配单行的%%开头内容。而启用单行模式(?s)后,.可以跨行匹配,才能实现跨行的内容分割。
内容的提问来源于stack exchange,提问作者user20386317
相关产品推荐
相关产品推荐

