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" の直後に、大なり括弧以外の最大 1000 文字が続くテキストと "version="" を照合したい; 照合するテキストの直後に二重引用符が続き、次を含む二重引用符はありません。

**Java 後読みについて注意を喚起してくれた Alan M に感謝しますಠ_ಠ</p>

この正規表現を置換操作で使用すると、version="" 属性内にあるものはすべて、置換値として設定したものに切り替わります。正しい形式のバージョン番号を提供するのはあなた次第です。

XML を使用してこれを行っているので、「なぜ XPath を使用しないのですか?」という疑問が生じます。

于 2008-10-08T12:54:15.610 に答える
2

タスクを使用していると仮定しますreplaceregexp

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

<feature>また、要素は 1 つしかないと仮定しています。

于 2008-10-08T13:00:30.933 に答える
1

楽しみのために:xpath(!)を使用したワンライナー、ルビー

(私は知っています:それは正規表現ではありませんが、言っているウィルの提案を説明することを意図しています

XML でこれを行っているので、当然の疑問は、「なぜ XPath を使用しないのですか?

)

'irb' と入力してから:
require "rexml/document";include REXML;file = File.new("a.xml"); doc = Document.new(file); puts doc; doc.elements.each("/機能") {|e| e.attributes["バージョン"]="1.2.3" }; docを置く

すべての「機能」要素のすべての「バージョン」属性を「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

Vim ti レスキュー:

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

どうですか:

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

括弧内は、バージョン番号に一致するグループです。括弧を移動して、必要な正確な一致を取得します。

于 2008-10-08T12:51:24.197 に答える