如何使用正则表达式替换两个标志符号之间的内容

How to replace stuff between two flag symbols using regex

例如我有下面的文字

some {}} outside, and some inside $aa{bb}cc{{dd}ee}ff$, and some more $aa{bb}cc{{dd}ee}ff$ here.

我调用 $ 标志符号,现在我想使用正则表达式替换 $...$ 对之间的所有 {}

我能想到的唯一方法是多次替换,使用正则表达式

($.*?)(\{|\})

每次替换 $...$ 中的 {}。经过足够的时间替换,我们得到了

some {}} outside, and some inside $aabbccddeeff$, and some more $aabbccddeeff$ here.

缺点是你不知道要{}完全替换多少次,显然效率不高。

所以我想知道,正则表达式是否能够在单个 运行 中完成此操作?对于正则表达式风格,我的意思是 perl 兼容。但是如果 perl 不能做到这一点,我很想知道其他正则表达式风格是否可以做到。

试试这个正则表达式:

[{}](?=[^$]*$(?:(?:[^$]*$){2})*[^$]*$)

Click for Demo

用空白字符串替换每个匹配项。

解释:

  • [{}] - 匹配 {}
  • (?=[^$]*$(?:(?:[^$]*$){2})*[^$]*$) - 正向前瞻以确保上述匹配后跟在字符串后面某处的奇数 $ 。这将确保 {} 后跟 1 或 3 或 5 或 7 ... $ 的实例在字符串后面的某处。