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