正则表达式如何精准提取两个分隔符之间的目标字符串
正则提取指定地址段解决方案
问题背景
- 待处理字符串样例:
[Radius: 4000 mi.] -- 61362 -- Spring Valley, IL, US - 提取目标:
Spring Valley, IL - 原有规则问题:使用
(?<=--)(.*?)(?=\, US)匹配时,会命中第一个--后的所有内容,带入61362 --这类冗余前缀,无法得到正确结果。
可用正则规则
方案1(易读易维护,推荐)
正则表达式:
--\s*(.*?)(?=, US$)
使用时取第1个捕获组的内容即可。
规则说明:
- 给后置匹配的
, US增加字符串结束锚定符$,确保匹配的是字符串最末尾的国家后缀,不会提前匹配到其他位置的同文字段 - 非贪婪匹配逻辑会自动定位到离末尾
, US最近的一个--分隔符作为匹配起点,自动跳过前面的半径值、编号等冗余内容 \s*用于兼容--后可能存在的空格字符,避免多余空格被带入提取结果
方案2(纯零宽断言,匹配结果直接为目标内容)
正则表达式:
(?<=-- )(?:(?! -- ).)*(?=, US$)
规则说明:
- 前置零宽断言定位
--分隔符位置 - 中间加负向预查
(?! -- ),确保匹配的内容段里不会再出现--分隔符,天然锁定最后一个分隔符后的地址段 - 后置零宽断言锚定末尾的
, US,整个匹配结果不需要额外处理分组,直接就是目标文本
原有规则失效原因
原规则的前置断言(?<=--)只校验当前位置前是否为--,字符串中第一个--(半径字段后的分隔符)也满足该条件,非贪婪匹配会从第一个符合前置条件的位置开始抓取,自然会把中间的编号段、第二个--都带入匹配结果。
内容的提问来源于stack exchange,提问作者Xander
相关产品推荐
相关产品推荐

