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

标签 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 一起使用。

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

最佳答案

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

    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() 的工作方式相同

关于java - 正则表达式提取两个给定字符串之间最后一次出现的文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17626358/

相关文章:

java - 获取Array List中以指定字符串开头的所有元素

java - 如何在 jgit 中调用 git show --first-parent?

java电子邮件提取正则表达式?

带箭头的 PHP 正则表达式 (>>)

java - 使 Ant 脚本中的 Java 步骤导致构建失败

java - 有没有办法确定正在运行的项目是 .war 还是 .jar 文件?

java - 如何将命名变量发布到 PHP 文件?

java - 查找包含文本的所有对象的查询

linux - ANT 执行失败 : java. io.IOException : Cannot run program "cp ": java. io.IOException : error=2, 没有这样的文件或目录

apache-flex - 如何使用此 flex 编译器选项将非嵌入文件复制到目标文件夹