1

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

给出一个如下所示的 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 一起使用。

先感谢您。如果您能帮我解释一下它是如何工作的,将不胜感激。

4

3 回答 3

1

您可以将文件读取为字符串,然后使用模式和匹配器类,这是一个示例

    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) 后跟点 (\\.) 组成的字符串,+ 表示一个或多个

'|' 是 Or-ing 运算符,因此您也可以匹配“init”

当模式的一部分包含在两个括号中时,这意味着它们形成一个组,最好将模式以组的形式放置,以便在您想使用该模式从匹配的字符串中单独获取一个组时变得容易匹配器

"matcher" 将匹配字符串中匹配模式的任何部分,matcher.group() 从整个字符串中获取匹配的部分,您也可以使用 matcher.group(i) 从匹配的字符串中获取组

例如这里 matcher.group(2) 将只带上没有字母 'v' 的数字和点,并注意它是 1 索引,其中 0 是目标字符串中的整个匹配部分,它在 matcher.group 中的工作方式相同()

于 2013-07-13T03:24:06.233 回答
0

这是单线:

String lastVersion = input.replaceAll("(?s).*include file=\"(.*?)\"/>[\n\\s]*</databaseChangeLog", "$1");
于 2013-07-13T03:54:47.710 回答
0

尝试下一个:

xmlString = xmlString.replace("\r", "").replace("\n", "");
String version = xmlString.replaceAll("^.*(v\\d+(\\.\\d+)*)[^\\d]+$","$1");
于 2013-07-13T02:45:32.917 回答