将文本替换为同一行中的其他文本

时间:2010-03-25 08:58:52

标签: xml regex replace

我不知道我是否可以使用正则表达式,但我想替换此xml中的内容:

<custom-attribute name="Attribute_1" dt:dt="string">Danny Boyle</custom-attribute>
<custom-attribute name="DVD-releasedatum" dt:dt="string">06/10/1999</custom-attribute>

应该成为

<Attribute_1>Danny Boyle</Attribute_1>
<DVD-releasedatum>06/10/1999</DVD-releasedatum>

从第一个标签中删除它并不难,但如何关闭新形成的标签?

5 个答案:

答案 0 :(得分:2)

这看起来像是XSLT的工作:

<?xml version="1.0"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
    <xsl:template match="custom-attribute">
        <xsl:element name="{@name}">
            <xsl:apply-templates/>
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

这为您提供了所需的输出,并且对于将来的修改和扩展非常灵活。

答案 1 :(得分:1)

如果您想这样做一次,可以选择Regex替换。否则,有更好的方法来转换XML,例如{。{3}}。

使用Regex时,您可以替换

\<custom-attribute.*?name="(\w+)".*?\>(.*?)\</custom-attribute\>

<$1>$2</$1>

将$ 1和$ 2替换为您程序中调用的任何引用。首先保存备份,但=)

答案 2 :(得分:1)

这适用于C#(不确定您使用的是哪种语言):

string input = "<custom-attribute name=\"Attribute_1\" dt:dt=\"string\">Danny Boyle</custom-attribute>\r\n<custom-attribute name=\"DVD-releasedatum\" dt:dt=\"string\">06/10/1999</custom-attribute>";

string output = Regex.Replace(input, "<custom-attribute name=\"(.*?)\".*?>(.*?)</custom-attribute>", "<$1>$2</$1>");

输出:

<Attribute_1>Danny Boyle</Attribute_1>
<DVD-releasedatum>06/10/1999</DVD-releasedatum>

答案 3 :(得分:1)

使用例如gvim,这样做:

:%s/.*name="\([^"]*\)"[^>]*>\([^<]*\)<.*/<\1>\2<\/\1>/cg

这是匹配部分:

.*name="\([^"]*\)"[^>]*>\([^<]*\)<.*

这是替换部分:

<\1>\2<\/\1>

答案 4 :(得分:1)

while(<DATA>)
{
  if($_=~s/^\<.*=\"(.*)\" .*\>([a-zA-Z]+|[0-9\/ ]+).*/<$1>$2<\/$1>/)
  {
      print $_;
  }
 }
__DATA__
<custom-attribute name="Attribute_1" dt:dt="string">Danny Boyle</custom-attribute>
<custom-attribute name="DVD-releasedatum" dt:dt="string">06/10/1999</custom-attribute>