如何编写匹配[bbcode]前一句的灵活正则表达式?
正则表达式匹配[bbcode]前的目标句子
解决方案正则
使用以下正则表达式可适配所有场景:
'/(?:(?<!.)|\.)\s*\K.+?(?=\s*\[bbcode\])/s'
正则解析
(?:(?<!.)|\.):匹配两种起始场景——要么是字符串起始位置((?<!.)断言前面无任何字符,替代禁用的^),要么是一个句号\s*:匹配任意数量的空白字符(空格、换行、制表符等),兼容格式混乱的输入\K:重置匹配结果的起始点,避免将前面的句号或空白纳入最终匹配内容.+?:非贪婪匹配任意字符,确保只取到最近的[bbcode]前的内容(?=\s*\[bbcode\]):正向预查,确保匹配内容后跟随任意空白和[bbcode]/s:单行模式,让.可匹配换行符,处理目标句子与[bbcode]跨多行的情况
适配验证
针对你的三个测试示例:
- 示例1:精准匹配
Blah blah blah.后的THIS SENTENCE SHOULD BE SELECTED - 示例2:匹配字符串起始到
[bbcode]前的THIS SENTENCE SHOULD BE SELECTED - 示例3:跳过句号后的换行空白,匹配到
THIS SENTENCE SHOULD BE SELECTED
原正则失效原因
你之前的/(?:\.)(.+)(\[bbcode\])/gUs存在两处问题:
- 仅覆盖句号后的场景,无法适配示例2中无前置句号的情况
- 贪婪匹配
.+可能从首个句号开始匹配,而非最近的那个,同时未处理目标句子与[bbcode]之间的空白换行
内容的提问来源于stack exchange,提问作者Robert Iannicca
相关产品推荐
相关产品推荐

