Регулярное выражение: замена номера версии в файле XML - PullRequest
1 голос
/ 08 октября 2008

Хорошо, я сдаюсь, я пытался написать регулярное выражение в 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 или версию множества плагинов в файле.

Проблема в том, что я либо слишком много, либо слишком мало. Определенного соответствия «версии» недостаточно, потому что все изменится

Есть ли простой способ сопоставить только версию внутри тега, учитывая, что «0.0.0» может быть любым числом?

Ответы [ 7 ]

3 голосов
/ 08 октября 2008

Следующее регулярное выражение может делать то, что вы хотите ...

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

Что, по-человечески, примерно означает

Я хочу сопоставить текст, который немедленно следует за строкой «<особенность», за которой следует до тысячи символы не больше скобки, а "version =" "; текст для соответствия сразу же сопровождается по двойной кавычке, и не содержит двойные кавычки. </p>

** Спасибо Алану М за советы о взглядах на Java ಠ_ಠ

Если вы используете это регулярное выражение с операцией Replace, оно будет отключать все, что находится внутри атрибута version = "", с любым значением, установленным вами в качестве значения замены. Вы должны предоставить правильно отформатированный номер версии.

Теперь, поскольку вы делаете это с XML, очевидный вопрос: «Почему вы не используете XPath?»

2 голосов
/ 08 октября 2008

Если вы используете задачу replaceregexp:

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

Я также предполагаю, что есть только один <feature> элемент.

1 голос
/ 08 октября 2008

Это может быть немного тяжеловесно, но, поскольку вы имеете дело с 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>
1 голос
/ 08 октября 2008

Просто для удовольствия: однострочник, с использованием xpath (!), С ruby ​​

(Я знаю: это не регулярное выражение, но оно призвано проиллюстрировать предложение Воли, которая говорит

Теперь, когда вы делаете это с XML, очевидный вопрос: «Почему вы не используете XPath?

)

введите 'irb', затем:
требует "rexml / document"; включает REXML; file = File.new ("a.xml"); doc = Document.new (файл); помещает doc; doc.elements.each ("/ feature") {| e | e.attributes ["version"] = "1.2.3"}; ставит документ

Заменяет все атрибуты 'version' всех элементов 'feature' на "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>
0 голосов
/ 08 октября 2008

Вим ти спасение:

:s/\(label=".+"\_.\s*version="\).+"/\1NEWVERSIONNUMBER"/
0 голосов
/ 08 октября 2008

Как насчет:

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

В скобках указана группа, соответствующая номеру версии. Переместите круглые скобки, чтобы получить точное соответствие, которое вам требуется.

0 голосов
/ 08 октября 2008

Регулярное выражение подстановки Perl будет выглядеть примерно так ...

s/<feature(.*?)version=".*?"/<feature$1version="1.2.3.4"/s
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...