Sublime text xml 替换正则表达式结果

Sublime text xml replace regex result

我在 Sumbilme Text 中替换正则表达式导致多个 xml 标签时遇到问题。

我有 xml 代码,在不同的组中有多个标签 <startDate>,如下所示:

<group1>
  <id>123</id>
  <startDate>2011-11-11</startDate>
  <city>New York</city>
  .
  .
</group1>
<group2>
  <id>456</id>
  <startDate>2013-10-01</startDate>
  <classCode>123</classCode>
  .
  .
</group2>
<group1>
  <id>789</id>
  <startDate>2016-01-17</startDate>
  <city>Washington</city>
  .
  .
</group1>
<group2>
  <id>135</id>
  <startDate>2013-12-22</startDate>
  <classCode>234</classCode>
  .
  .
</group2>

我想将每个标签 <startDate>(...some date...)</startDate> 替换为 <group2><startDate1>(...some date...)</startDate1>

括号中的文字(...某个日期...)不同。

我开始寻找这个标签并使用了这个代码:

(?=.*<startDate>)(?=.*</startDate>
                    <classCode>)

并且有效。 Sublime 在 <group2> 中找到了每个标签 <startDate>(...some date...)</startDate>。 但是我在替换 founded 标签中的文本时遇到了问题。

我试图将此代码放入 'Replace' 行:

(?=.*<startDate1>)(?=.*</startDate1>
                    <classCode>)

没用。

所以我找到了另一个选择。

在 'Find' 行我输入:

(?=.*(<startDate)(>))(?=.*(</startDate)(>
                    <classCode>))

并且在 'Replace' 行中:

 1   1 

但结果是:

.
.
</group1>
<group2>
  <id>456</id>
  <startDate 1 > </startDate 1 >
                    <classCode><startDate 1 > </startDate 1 >
                    <classCode><startDate 1 > </startDate 1 >
                    <classCode><startDate 1 > </startDate 1 >
                    <classCode><startDate 1 > </startDate 1 >
                    <classCode><startDate 1 > </startDate 1 >
                    <classCode><startDate 1 > </startDate 1 >
                    <classCode><startDate 1 > </startDate 1 >
                    <classCode><startDate 1 > </startDate 1 >
                    <classCode><startDate 1 > </startDate 1 >
                    <classCode><startDate 1 > </startDate 1 >
                    <classCode><startDate>2015-11-02</startDate>
                    <classCode>123</classCode>

所以我的目标标签没有改变,但添加了新的...

我想要这样的结果:

<group1>
  <id>123</id>
  <startDate>2011-11-11</startDate>
  <city>New York</city>
  .
  .
</group1>
<group2>
  <id>456</id>
  <startDate1>2013-10-01</startDate1>
  <classCode>123</classCode>
  .
  .
</group2>

有没有办法不手动替换标签名称?

我试着搜索这个:(<\/?)startDate> 并替换为 startDate1>

这看起来太简单了。你能告诉我一个能骗过这个正则表达式的输入吗?

更新

根据更新后的问题,这是我能想到的:

正则表达式:(?s)startDate>((?:.(?!\/group[013456789]))*)(?=\/group2) 替换:startDate1>

您必须 运行 'Replace All' 两次才能替换每个必需的标签。我正在检查是否可以 运行 一次。

此外,让我为此类任务推荐 XSLT。

是这样的吗?

<startDate>([\d-]+)<\/startDate>(?=\s*<classCode>)

替换为:

<startDate1></startDate1>

测试一下here