我有以下格式的字符串
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 :(得分:1)
如何在java中的单个正则表达式中执行此操作。
使用捕获组,如下所示。 正则表达式:
^Index:.*\/(.*)
现在可以使用matcher.group(1)
获取文件名,并由正则表达式中的最后一部分(.*)
表示
^
匹配起始锚Index:
与文字原样匹配.*
匹配任何内容(贪婪)\/
匹配斜杠/
(.*)
匹配捕获组中的文件名确保设置(?m)
或Pattern.MULTILINE
标志,以便匹配为多行并匹配每行开头的起始锚点^
。
编辑:修改您的代码只使用一个正则表达式,如下所示:
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
答案 1 :(得分:0)
请使用^Index.+\/([^\.]+\.\w+)$
标记gm
或Index.+\/([^\.]+\.\w+)
不带m
标记。唯一的捕获组是文件名。
答案 2 :(得分:0)