如何编写正则表达式捕获以三位数字行分隔的所有文本块?
问题
现有一段文本解析出错,多个文本块被仅含三位数字的行分隔,需要编写正则表达式捕获每个文本块:
- 文本块需起始并包含三位数字的行
- 范围覆盖到下一个三位数字行前的最后一处空白
此前尝试的正则:
\n*((\d{3})\n*([\S\s]+?)(?=\s\d{3}\s))
但因使用前瞻断言,导致最后一个文本块无法被捕获。
示例原始文本:
foo 000 foo bar foo 461 long multiline text 999 last example until rest of document
预期捕获的文本块:
[000 foo bar foo ] Group 1 [461 long multiline text ] Group 2 [999 last example until rest of document] Group 3
解决方案
把前瞻断言改成匹配下一个三位数字行或者文本结束,就能覆盖最后一个文本块。修正后的正则:
(\d{3}[\s\S]+?)(?=\n\d{3}\n|\Z)
正则说明
\d{3}:匹配作为分隔符的三位数字行[\s\S]+?:非贪婪匹配所有内容(含换行),避免过度匹配(?=\n\d{3}\n|\Z):前瞻断言,匹配两种终止条件:\n\d{3}\n:下一个独立的三位数字行(前后换行确保是单独一行)\Z:文本的结束位置,覆盖最后一个没有后续分隔符的文本块
效果验证
用修正后的正则匹配示例文本,会精准捕获到三个预期的文本块,包括之前遗漏的最后一个块。
内容的提问来源于stack exchange,提问作者Jano
相关产品推荐
相关产品推荐

