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

如何在单行多处替换两字符串间的子串?求正则表达式方案

嘿,这个需求用正则表达式就能轻松解决!咱们分两种方案来聊,适配不同的工具和场景:

方案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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 07:16:28