[英]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.