如何在单行多处替换两字符串间的子串?求正则表达式方案
嘿,这个需求用正则表达式就能轻松解决!咱们分两种方案来聊,适配不同的工具和场景:
方案1:捕获组写法(兼容性拉满,支持所有正则工具)
正则模式:
(FFFFFF)(.*?)(EE9911)
替换内容:
$1 <data> $3
(注:不同工具的捕获组引用符号有差异,比如Python/sed里要用\1代替$1)
拆解说明:
(FFFFFF):捕获固定前缀FFFFFF,替换时会保留这个部分(.*?):非贪婪匹配任意字符(单行文本里.能匹配除换行外的所有内容),这是核心——它只会匹配到最近的EE9911,不会从第一个FFFFFF直接跳去最后一个EE9911(EE9911):捕获固定后缀EE9911,替换时保留该部分- 记得加上全局匹配标志(比如JS里的
/g,Python的re.sub默认全局替换),确保所有符合的配对都被替换
工具示例:
JavaScript:
const originalText = "FFFFFF first EE9911 second FFFFFF third EE9911 fourth"; const replacedText = originalText.replace(/(FFFFFF)(.*?)(EE9911)/g, '$1 <data> $3'); console.log(replacedText); // 输出:"FFFFFF <data> EE9911 second FFFFFF <data> EE9911 fourth"
Python:
import re original_text = "FFFFFF first EE9911 second FFFFFF third EE9911 fourth" replaced_text = re.sub(r'(FFFFFF)(.*?)(EE9911)', r'\1 <data> \3', original_text) print(replaced_text)
方案2:正向断言写法(更简洁,适合现代工具)
如果你的工具支持正向后顾断言(比如JS ES2018+、Python3.6+、PHP等),可以用更清爽的写法,不用捕获组:
正则模式:
(?<=FFFFFF).*?(?=EE9911)
直接替换为:
<data>
拆解说明:
(?<=FFFFFF):正向后顾,确保当前位置前是FFFFFF,但不会把它纳入匹配内容.*?:还是非贪婪匹配中间的所有内容(?=EE9911):正向预查,确保当前位置后是EE9911,同样不纳入匹配内容- 同样要开启全局匹配,替换所有符合的配对
JavaScript示例:
const replacedText = originalText.replace(/(?<=FFFFFF).*?(?=EE9911)/g, ' <data> ');
关键提醒
一定要用非贪婪的.*?,如果写成.*(贪婪匹配),会直接匹配从第一个FFFFFF到最后一个EE9911的所有内容,完全不符合你的需求!
内容的提问来源于stack exchange,提问作者Rishika Maroo
相关产品推荐
相关产品推荐

