首先,如果发布了类似的内容,我深表歉意。我的正则表达式知识非常有限,无法找到可以适应的东西。
给出一个如下所示的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一起使用。
提前谢谢。如果你能帮我解释一下它是如何工作的,我将不胜感激。
您可以将文件读取为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()上的工作原理相同
尝试下一个:
xmlString = xmlString.replace("r", "").replace("n", "");
String version = xmlString.replaceAll("^.*(v\d+(\.\d+)*)[^\d]+$","$1");
这是一条线:
String lastVersion = input.replaceAll("(?s).*include file="(.*?)"/>[n\s]*</databaseChangeLog", "$1");