我有一个格式如下的字符串
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)
获取文件名,并由正则表达式中的最后一部分 (.*)
表示
^
匹配起始 anchorIndex:
按原样匹配文字.*
匹配任何内容(贪心)\/
匹配斜杠/
(.*)
匹配捕获组中的文件名
确保设置了 (?m)
或 Pattern.MULTILINE
标志,以便匹配是多行的并且匹配起始 anchor ^
在每一行的开头。
编辑:修改您的代码以仅使用一个正则表达式,如下所示:
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
关于java - 在Java中匹配一行并提取文件名的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44239613/