崇高的文本 xml 替换正则表达式结果



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

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

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

我只想在<group2>中替换每个标签<startDate>(...some date...)</startDate><startDate1>(...some date...)</startDate1>

括号中的文本 (...某个日期...是不同的。

开始找到这个标签,我使用了这个代码:

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

它有效。崇高在<group2>中找到了每一个标签<startDate>(...some date...)</startDate>。但是我在替换已建立的标签中的文本时遇到问题。

我试图将此代码放入"替换"行中:

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

它没有用。

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

在"查找"行中,我输入:

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

在"替换"行中:

$1 1 $2 $3 1 $4

但结果是:

.
.
</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>([d-]+)</startDate>(?=s*<classCode>)

替换为:

<startDate1>$1</startDate1>

在这里测试

我尝试搜索这个:(</?)startDate>并替换为1startDate1>.

这看起来太简单了。你能给我看一个可以欺骗这个正则表达式的输入吗?

更新

根据更新的问题,这就是我可以想到的:

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

您必须运行"全部替换"两次才能替换每个必需的标记。我正在检查我是否可以让它只运行一次。

另外,让我建议使用 XSLT 来完成此类任务。

最新更新