正则表达式匹配优化:按单词分割、保留标点及空行换行触发
解决方案
使用以下正则表达式可满足需求:
/(?<!\S)(?:[\p{L}\p{M}\p{N}\p{P}]+(?:\s+[\p{L}\p{M}\p{N}\p{P}]+)*){1,}(?=\s|$|.{40,})|\n/gmu
正则说明
(?<!\S): 断言匹配起始位置前无空白字符,确保从单词开头或行首开始匹配[\p{L}\p{M}\p{N}\p{P}]+: 匹配包含Unicode字母、标记、数字、标点的完整“单词单元”,覆盖ßäöü及.?!,-这类特殊字符(?:\s+[\p{L}\p{M}\p{N}\p{P}]+)*: 匹配后续空格+单词组合,保证匹配完整短语而非截断单词(?=\s|$|.{40,}): 触发拆分的条件:遇到空格、行尾,或剩余字符长度超40,确保单块内容不超40字符|\n: 单独匹配换行符,对应预期中的行尾换行匹配项gmu: 全局匹配(g)、多行模式(m)、Unicode模式(u),适配多行文本与特殊Unicode字符
匹配结果验证
该正则对目标文本的匹配完全符合预期:
Dear reader,(0-11)\n(11-12)this is an example text to show my(13-48)problem with regex(48-66)The dot at the end of the line is not(67-105)included(105-113)\n(114-115)But I want it to be included.(116-144)\n(145-146)Thanks for your help,(147-167)\n(168-169)Shibeson.(170-178)
内容的提问来源于stack exchange,提问作者ShibeSon
相关产品推荐
相关产品推荐

