正则表达式提取两个给定字符串之间的文本的最后一次出现

时间:2013-07-13 02:17:33

标签: java regex ant regex-negation

首先,如果发布类似内容我会道歉。我的正则表达式知识非常有限,我找不到能够适应的东西。

提供如下所示的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一起使用。

提前谢谢你。如果你能帮助我一些关于它如何工作的解释将非常感激。

3 个答案:

答案 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");