You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

正则匹配ddd-dd-ddd模式及后续至下一同模式文本的问题

解决正则捕获ddd-dd-ddd模式及后续跨行文本的问题

嘿,我来帮你搞定这个正则难题!你的问题核心在于原正则的两个局限:一是.默认不匹配换行符,所以跨不了行;二是贪婪匹配的.*会一直吃到文本末尾,没法停在下一个编号前。

解决方案正则表达式

直接用这个正则就能满足需求:

\b\d{3}-\d{2}-\d{3}\b[\s\S]*?(?=\b\d{3}-\d{2}-\d{3}\b|$)

拆解每个部分的作用

  • \b\d{3}-\d{2}-\d{3}\b:精准匹配你要的ddd-dd-ddd编号模式,\d是[0-9]的简洁写法,\b用来确保是独立的编号(避免和更长的数字串混淆)
  • [\s\S]*?:\s匹配空白字符(包括换行),\S匹配非空白字符,合起来就是匹配任意字符(包括换行);*?是非贪婪匹配模式,会尽可能少地匹配内容,直到后面的条件触发
  • (?=\b\d{3}-\d{2}-\d{3}\b|$):这是正向预查,用来告诉正则“当你遇到下一个编号,或者文本结束的时候就停止匹配”,而且不会把下一个编号包含到结果里

可选优化:利用DOTALL模式

如果你的正则引擎支持DOTALL(比如Python的re.DOTALL、Java的Pattern.DOTALL),可以把[\s\S]换成.,写法更简洁:

\b\d{3}-\d{2}-\d{3}\b.*?(?=\b\d{3}-\d{2}-\d{3}\b|$)

记得开启DOTALL模式,让.能匹配换行符就行。

实际效果示例

假设你的输入文本是:

982-99-122 这是第一行的文本
这是第二行的跨行文本
586-33-453 这是第二个编号的文本
还有第三行
777-88-999 最后一个编号的内容

用上面的正则会分别捕获到三个独立的片段:

  1. 982-99-122 这是第一行的文本\n这是第二行的跨行文本
  2. 586-33-453 这是第二个编号的文本\n还有第三行
  3. 777-88-999 最后一个编号的内容

内容的提问来源于stack exchange,提问作者porswengr

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 06:26:28