2017-05-29 159 views
2

匹配行和提取文件名我有一個字符串以以下格式正則表達式在Java

Index: /aap/guru/asdte/atsAPI.tcl 
=================================================================== 
RCS file: /autons/atsAPI.tcl,v 
retrieving revision 1.41 

Index: /aap/guru/asdte/atsAPI1.tcl 
=================================================================== 
RCS file: /autons/atsAPI1.tcl,v 
retrieving revision 1.41 

我想要的是匹配行開始Index:,然後得到路徑的文件名。

我的意思是先獲得Index: /aap/guru/asdte/atsAPI.tcl,然後提取atsAPI.tcl作爲最終結果。

目前我正在使用匹配兩次,第一整行,然後提取文件名。

我的問題是,如何在java中的單個正則表達式中做到這一點。

當前的代碼

String line = "Index: /aap/guru/asdte/atsAPI.tcl\r\n===================================================================\r\nRCS file: /autons/atsAPI.tcl,v\r\nretrieving revision 1.41\r\n\r\nIndex: /aap/guru/asdte/atsAPI1.tcl\r\n===================================================================\r\nRCS file: /autons/atsAPI1.tcl,v\r\nretrieving revision 1.41"; 
Pattern regex1 = Pattern.compile("Index:.*?\\n", Pattern.DOTALL); 
Pattern regex2 = Pattern.compile("[^*/]+$"); 

Matcher matcher1 = regex1.matcher(line); 
while (matcher1.find()) { 
    String s = matcher1.group(0); 

    Matcher matcher2 = regex2.matcher(s); 
    while (matcher2.find()) { 
     System.out.println(matcher2.group(0)); 
    } 
} 
+0

https://codebunk.com/b/128141613/ –

+0

你不需要'DOTALL'標誌,它使你在你的不貪婪的點上添加一個換行符。 '.'默認與新行不匹配。 – revo

+0

@g_p我已經包括瞭如何使用一個正則表達式以及我的答案中的工作演示。希望能幫助到你! – degant

回答

1

如何做到這一點在一個普通在java中表達。

使用捕獲組如下所示。 正則表達式:

^Index:.*\/(.*) 

現在的文件名可以通過使用matcher.group(1)來獲得,並且由最後部分(.*)在正則表達式表示

  • ^比賽開始錨
  • Index:字面原樣匹配是
  • .*匹配任何東西(貪婪)
  • \/比賽斜線/
  • (.*)在捕獲組文件名

確保(?m)Pattern.MULTILINE標誌設置,這樣的匹配是多線的起始錨^在每一行的開頭匹配匹配。

Regex101 Demo

編輯:修改代碼,只使用一個正則表達式,像這樣:

Pattern pattern = Pattern.compile("^Index:.*\\/(.*)", Pattern.MULTILINE); 

Matcher matcher = pattern.matcher(line); 
while (matcher.find()) { 
    System.out.println(matcher.group(1)); 
} 

// Output: 
atsAPI.tcl 
atsAPI1.tcl 

Demo

0

試試這個^Index.+\/([^\.]+\.\w+)$gm標誌或Index.+\/([^\.]+\.\w+)沒有m標誌。唯一的捕獲組是文件的名稱。

0

試試下面的正則表達式,得到的答覆是第一場比賽組:

Index:.*?\/([\w]+\.[\w]*) 

您可以通過以下鏈接進行調試: Regex link