PCRE正则表达式优化:去点前空格加点后空格且不影响省略号
解决正则匹配省略号的问题
没问题,我来帮你调整这个正则表达式,完美解决省略号被拆分的问题!
你遇到的核心问题是原正则[ \t]*\.[ \t]*会匹配省略号里的每个单独的点(因为允许前后0个空白),替换后自然就把...拆成了. . .。用负向前瞻和负向后顾就能轻松排除这种场景,直接在你原有正则的基础上修改就行:
(?<!\.)[ \t]*\.[ \t]*(?!\.)
我来拆解一下这个正则的关键部分:
(?<!\.):这是负向后顾,意思是“当前匹配的点前面不能是另一个点”,这样就不会选中省略号里中间或最后那个点[ \t]*\.[ \t]*:你原来的匹配逻辑,负责匹配点以及前后的空格/制表符(?!\.):这是负向前瞻,意思是“当前匹配的点后面不能是另一个点”,这样就不会选中省略号里开头或中间的点
这样修改后,正则只会匹配那些单独的、前后不是点的句号,比如word .Word里的那个点,替换成. 就能得到你想要的word. Word效果;而省略号...里的每个点因为前后都是点,会被直接跳过,不会被拆分。
如果需要测试的话,你可以直接在PHP里用preg_replace来验证:
$text = "word .Word 这是省略号... 另一个例子test .Test"; $fixedText = preg_replace('/(?<!\.)[ \t]*\.[ \t]*(?!\.)/', '. ', $text); echo $fixedText; // 输出:word. Word 这是省略号... 另一个例子test. Test
内容的提问来源于stack exchange,提问作者user1614753




