繁体   English   中英

正则表达式模式来解析带有制表符和换行符的路径?

[英]Regex pattern to parse path with tabs and newlines?

我有一个路径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作为第一个匹配项。 我究竟做错了什么?

由于所有部分都由行分隔符\\n分隔,因此您可以简单地使用.+来匹配它们,因为默认情况下是dot . 不能匹配行分隔符,因此请确保它会在\\n (或其他任何行分隔符,如\\r )之前停止。

您还可以将一些组添加到与实际段分开的标签中,例如命名组 (?<tabs>\\t*)以在每次匹配开始时匹配零个或多个标签。

要在匹配后打印其余文本,只需在最后一个匹配字符的索引后添加子字符串即可(您可以通过Matcher#end获得它)。

要打印包含\\n\\t字符串(不是字面量,而是反斜杠和字母对),您可以手动将每个"\\n"替换为"\\\\n" ,将"\\t"替换为"\\\\t"或使用工具类,像StringEscapeUtilsorg.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: 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM