簡體   English   中英

正則表達式提取兩個給定條紋之間的文本的最后一次出現

[英]regex to extract last occurence of a text between two given 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組成,字母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");

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM