我有一个路径dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext
,我想一次处理一个分段。对于每个段,我想知道在它前面有多少个选项卡,并且我希望保留路径的其余部分。对于给定的示例
迭代1:
Preceding tabs: 0
Segment: dir
Rest: \n\tsubdir1\n\tsubdir2\n\t\tfile.ext
迭代2:
Preceding tabs: 1
Segment: subdir1
Rest: \n\tsubdir2\n\t\tfile.ext
迭代3:
Preceding tabs: 1
Segment: subdir2
Rest: \n\t\tfile.ext
迭代4:
Preceding tabs: 2
Segment: file.ext
Rest: ""
我想到的模式是((?<=\\R)\\h*)(\\H+)
。但是,这给了我\tsubdir1\n
作为第一场比赛。我在做什么错了?
答案 0 :(得分:1)
由于所有节都由行分隔符\n
分隔,因此您可以简单地使用.+
来匹配它们,因为默认情况下,点.
不能与行分隔符匹配,因此请确保将在\n
(或其他任何行分隔符,例如\r
)之前停止。
您还可以将一些组添加到与实际细分受众群分开的标签中,例如named group (?<tabs>\t*)
,以在每次匹配开始时匹配零个或多个标签。
要在匹配后打印其余文本,只需在最后一个匹配字符的索引后添加子字符串即可(您可以通过Matcher#end
获得它。)
要打印包含\n
和\t
的字符串(不是字面量,而是反斜杠和字母对),您可以将每个"\n"
手动替换为"\\n"
,然后"\t"
与"\\t"
或使用StringEscapeUtils
中的org.apache.commons.lang
之类的实用工具类,其中包含为我们执行此操作的escapeJava
方法。
因此您的代码如下所示:
String path = "dir\n\tsubdir1\n\tsubdir2\n\t\tfile.ext";
Pattern p = Pattern.compile("(?<tabs>\t*)(?<segment>.+)");//dot can't match line separators
Matcher m = p.matcher(path);
int i = 1;
while(m.find()){
System.out.println("iteration: " + i++);
System.out.println("Preceding tabs: " + (m.group("tabs").length()));
System.out.println("Segment: " + m.group("segment"));
System.out.println("Rest: "+ StringEscapeUtils.escapeJava(path.substring(m.end())));
System.out.println();
}
输出:
iteration: 1
Preceding tabs: 0
Segment: dir
Rest: \n\tsubdir1\n\tsubdir2\n\t\tfile.ext
iteration: 2
Preceding tabs: 1
Segment: subdir1
Rest: \n\tsubdir2\n\t\tfile.ext
iteration: 3
Preceding tabs: 1
Segment: subdir2
Rest: \n\t\tfile.ext
iteration: 4
Preceding tabs: 2
Segment: file.ext
Rest: