java - 在Java中匹配一行并提取文件名的正则表达式

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

最佳答案

how to do it in a single regular expression in java.

使用捕获组,如下所示。 正则表达式:

^Index:.*\/(.*)

现在可以使用 matcher.group(1) 获取文件名,并由正则表达式中的最后一部分 (.*) 表示

  • ^ 匹配起始 anchor
  • Index: 按原样匹配文字
  • .* 匹配任何内容(贪心)
  • \/ 匹配斜杠 /
  • (.*) 匹配捕获组中的文件名

确保设置了 (?m)Pattern.MULTILINE 标志,以便匹配是多行的并且匹配起始 anchor ^在每一行的开头。

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

关于java - 在Java中匹配一行并提取文件名的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44239613/

相关文章:

regex - 为什么 grep 不能在这种模式下使用冒号?

python - 如何检查有效的 Git 分支名称?

regex - Sed 仅删除第一次出现的字符串

java - 如何将信息从重写的 ActionListener 方法发送到 Java 中的 main 方法?

java.lang.UnsatisfiedLinkError : no kdu_jni in java. 库.path

java.lang.SecurityException : invalid package name: com. 谷歌.android.gms

regex - 正则表达式从开始到换行都获取每个字符串?

java - 使用 Java 中的属性文件中的值更新数据库

java - 如何从 Lucene TokenStream 中获取 Token?

javascript RegEx 主题标签匹配 #foo 和 #foo-fåäö 但不匹配 http ://this. is/no#hashtag