1

好的,我放弃了,我一直在尝试在 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”可以是任何数字,是否有任何简单的方法可以匹配标签内的版本?

4

7 回答 7

3

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

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

用人类的话说,大致意思是

我想匹配紧跟在字符串“<feature”之后的文本,后跟最多一千个字符而不是大于括号和“version =”;要匹配的文本后面紧跟双引号,并包含没有双引号。

**感谢 Alan M 提供有关 java lookbehinds ಠ_ಠ</p> 的提示

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

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

于 2008-10-08T12:54:15.610 回答
2

假设您正在使用该replaceregexp任务:

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

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

于 2008-10-08T13:00:30.933 回答
1

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

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

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

)

输入“irb”,然后:
需要“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”

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>
于 2008-10-08T14:05:58.103 回答
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>
于 2008-10-08T15:01:16.853 回答
0

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

s/<feature(.*?)version=".*?"/<feature$1version="1.2.3.4"/s
于 2008-10-08T12:44:51.573 回答
0

怎么样:

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

括号中是与版本号匹配的组。移动括号以获得您需要的精确匹配。

于 2008-10-08T12:51:24.197 回答
0

Vim 的救援:

:s/\(label=".+"\_.\s*version="\).+"/\1NEWVERSIONNUMBER"/
于 2008-10-08T13:05:55.773 回答