regex,用于提取两个给定strigs之间最后一次出现的文本



首先,如果发布了类似的内容,我深表歉意。我的正则表达式知识非常有限,无法找到可以适应的东西。

给出一个如下所示的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");

相关内容

  • 没有找到相关文章

最新更新