首先,如果发布类似内容我会道歉。我的正则表达式知识非常有限,我找不到能够适应的东西。
提供如下所示的XML文件:
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog>
<include file="init.changelog.xml"/>
<include file="v9.1.changelog.xml"/>
<include file="v9.2.changelog.xml"/>
<include file="v9.3.changelog.xml"/>
<include file="v9.3.1.changelog.xml"/>
<include file="v9.3.3.changelog.xml"/>
</databaseChangeLog>
我想有一个正则表达式,它将提取更改日志文件的最新版本。在上面的示例中,将是字符串v9.3.3
正则表达式需要与java兼容,因为我需要将它与ant一起使用。
提前谢谢你。如果你能帮助我一些关于它如何工作的解释将非常感激。
答案 0 :(得分:1)
您可以将文件读取为String然后使用Pattern和matcher类,这是一个示例
String target = "...<include file=\"init.changelog.xml\"/><include file=\"v9.1.changelog.xml\"/><include file=\"v9.3.3.changelog.xml\"/></databaseChangeLog>...";
Pattern pattern = Pattern.compile("(v)((\\d\\.)+)|init");
Matcher matcher = pattern.matcher(target);
String version = "";
while (matcher.find())
{
version = matcher.group();
System.out.println(version);
}
// use version
表达式(v)((\\ d \\。)+ | init):表示匹配字符串由字母v后跟整数(\\ d)后跟点(\\。)和+表示一个或更
'|'是Oring运算符,所以你也可以匹配“init”
当两个括号中包含部分模式时,它意味着它们形成一个组,当你想从匹配的字符串中自己获取一个组时,最好将模式放在组中以使其变得容易使用模式匹配器
“matcher”将匹配匹配模式的字符串的任何部分,matcher.group()从整个字符串中获取此部分匹配,您也可以使用matcher.group(i)从匹配的字符串中获取一个组
例如这里matcher.group(2)将只带来没有字母'v'的数字和点,并注意它是1索引,其中0是目标字符串的整个匹配部分,它的工作原理相同matcher.group()
答案 1 :(得分:0)
尝试下一个:
xmlString = xmlString.replace("\r", "").replace("\n", "");
String version = xmlString.replaceAll("^.*(v\\d+(\\.\\d+)*)[^\\d]+$","$1");
答案 2 :(得分:0)
这是单行:
String lastVersion = input.replaceAll("(?s).*include file=\"(.*?)\"/>[\n\\s]*</databaseChangeLog", "$1");