Regexp:替换XML文件中的版本号

时间:2008-10-08 12:39:12

标签: java regex ant

好吧,我放弃了,我一直在尝试在ant中编写一个正则表达式来替换我在属性文件中的版本号。我有以下内容:

<?xml version="1.0" encoding="UTF-8"?>
    <feature
          id="some.feature.id"
          label="Some test feature"
          version="1.0.0"
          provider-name="Provider">

   <plugin
         id="test.plugin"
         download-size="0"
         install-size="0"
         version="0.0.0"
         unpack="false"/>
..... many plugins later....
</feature>

我想要实现的只是替换功能标记的版本号,而不更改文件中xml的版本或插件的miriad版本。

我遇到的问题是我要么匹配太多要么太少。最终匹配“版本”是不够的,因为一切都会改变

考虑到'0.0.0'可以是任何数字,有没有简单的方法来匹配标签内的版本?

7 个答案:

答案 0 :(得分:3)

以下正则表达式可以做你想要的......

(?<=<feature[^>]{*,1000}version=")[^"]*(?=")

在人类说话中,大致意味着

  

我想立即匹配文字   跟随字符串“&lt; feature”,后跟最多一千   字符不是大于括号,和   “version =”“;紧跟着要匹配的文字   用双引号,并包含否   双引号。

** 感谢Alan M关于java lookbehinds的提示ಠ_ಠ

如果将此正则表达式与Replace操作一起使用,它将切换出version =“”属性中的任何内容,无论您将其设置为替换值。由您来提供正确格式化的版本号。

现在,既然您正在使用XML,那么显而易见的问题是,“为什么不使用XPath?”

答案 1 :(得分:2)

假设您正在使用replaceregexp任务:

<replaceregexp file="whatever"
               match="(<feature\b[^<>]+?version=\")[^\"]+"
               replace="\1${feature.version}" />

我还假设只有一个<feature>元素。

答案 2 :(得分:1)

只是为了好玩:一个单行,使用xpath (!), ruby​​

(我知道:这不是一个正则表达式,但它是为了说明威尔的建议,谁在说

  

现在,既然您正在使用XML,那么显而易见的问题是,“为什么不使用XPath?

输入'irb',然后:
require“rexml / document”;包含REXML; file = File.new(“a.xml”); doc = Document.new(file); puts doc; doc.elements.each(“/ feature”){| e | e.attributes [“version”] =“1.2.3”};放医生

它用“1.2.3”

替换所有'feature'元素的所有'version'属性
irb(main):001:0* require "rexml/document";include REXML;file = File.new("a.xml"); doc = Document.new(file);puts doc; doc.elements.each("/feature") {|e| e.attributes["version"]="1.2.3" }; puts doc

<?xml version='1.0' encoding='UTF-8'?>
<feature id='some.feature.id' version='1.0.0' provider-name='Provider' label='Some test feature'>
   <plugin unpack='false' id='test.plugin' download-size='0' version='0.0.0' install-size='0'/>
</feature>


<?xml version='1.0' encoding='UTF-8'?>
<feature id='some.feature.id' version='1.2.3' provider-name='Provider' label='Some test feature'>
   <plugin unpack='false' id='test.plugin' download-size='0' version='0.0.0' install-size='0'/>
</feature>

答案 3 :(得分:1)

它可能有点重量级,但由于你正在处理XML,我建议使用这样的XSLT:

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.0">
    <xsl:template match="@*|*">
        <xsl:copy>
            <xsl:apply-templates select="node()|@*|*"/>
        </xsl:copy>
    </xsl:template>


    <xsl:template match="/feature/@version">
        <xsl:attribute name="version">
            <xsl:text>1.0.1</xsl:text>
        </xsl:attribute>
    </xsl:template>
</xsl:stylesheet>

答案 4 :(得分:0)

Perl替换正则表达式看起来像这样......

s/<feature(.*?)version=".*?"/<feature$1version="1.2.3.4"/s

答案 5 :(得分:0)

怎么样:

<feature[^<>]+version\s*=\s*"(\d+\.\d+\.\d+)"[^<>]*>

括号中是与版本号匹配的组。移动括号以获得所需的完全匹配。

答案 6 :(得分:0)

Vim ti the rescue:

:s/\(label=".+"\_.\s*version="\).+"/\1NEWVERSIONNUMBER"/