java - 使用制表符和换行符解析路径的正则表达式模式?

标签 java regex regex-lookarounds regex-group

我有一条路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 分隔您可以简单地使用.+匹配它们,因为默认情况下点 .无法匹配行分隔符,因此您确定它会在 \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: 

关于java - 使用制表符和换行符解析路径的正则表达式模式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55055788/

相关文章:

java - 如何使用java用字符串中的空格替换(和)括号

java - 根据模式匹配从文件中提取行集

java - InputStreamReader.markSupported 为 false

java - 尽管 AndroidManifest.xml 中提到了,为什么我的 Android 应用程序无法获得某些权限

java - 使用对象数组调用构造函数

regex - 什么是匹配不带子域的有效域名的正则表达式?

php - 文件名的正则表达式,没有 url?

java - 模式/正则表达式*仅*如果它是记录中的唯一字段

java - Oracle WebLogic Server 12.1.2.0.0 中的错误 : Could not find or load main class weblogic. management.commo.WebLogicMBeanMaker

java - 序列化逻辑应该在实体还是其他类中