正则表达式,用于匹配Java中的行和提取文件名

时间:2017-05-29 09:58:17

标签: java regex

我有以下格式的字符串

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));
    }
}

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

请使用^Index.+\/([^\.]+\.\w+)$标记gmIndex.+\/([^\.]+\.\w+)不带m标记。唯一的捕获组是文件名。

答案 2 :(得分:0)

尝试以下正则表达式,答案在第一个匹配组中:

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

您可以在以下链接中调试它: Regex link