RegEx 如何 link 为 search/replace 匹配 beginning/end 字符串?

RegExp How to link matching beginning/end strings for search/replace?

我有一个 XML 文件,需要查找并替换包含在两对标签中任何一个之间但不能混合的特定模式的所有出现。

示例

 a) <CnlNum>548</CnlNum>
 b) GetBit(Val(548), 3)

548 是我需要查找并更改为 1548 的示例文本。 (实际上500到999之间的任何3位数字都必须用数字+1000代替)。

我使用了以下内容:

搜索正则表达式:

(<CnlNum>|Val\s?\()([5-9])(\d{2})(</CnlNum>|\),\s?)

替换正则表达式:

()1

问题是这个搜索正则表达式,虽然是一个工作的正则表达式,但不仅匹配相应的 startin/ending 字符串对,而且还会找到以下内容,这是错误的:

<CnlNum>548),

我想知道如何 link 正则表达式中的 starting/ending 文本?

我认为这对于 link 匹配 XML 或 HTML 标签 (...) 很有用。

您可以捕获第一组中的备选方案,然后使用条件构造:

((<CnlNum>)|(Val\s?\())([5-9])(\d{2})((?(2)</CnlNum>|\),\s?))
 ^        ^ ^        ^                ^^^^^         ^      ^

regex demo详情:

  • ((<CnlNum>)|(Val\s?\()) - 第 1 组:<CnlNum>(第 2 组)或 Val + 一个可选的空格和一个 ( 字符(第 3 组)
  • ([5-9]) - 第 4 组:从 59
  • 的数字
  • (\d{2}) - 第 5 组:任意两位数字
  • ((?(2)</CnlNum>|\),\s?)) - 第 6 组:如果第 2 组匹配,则匹配 </CnlNum>,否则,匹配 )、逗号和可选空格。