【问题标题】:Split string with regex but include part of the regex in the substrings使用正则表达式拆分字符串,但在子字符串中包含部分正则表达式
【发布时间】:2018-03-20 15:11:54
【问题描述】:

我有一个这样的字符串:

"tag0 tag1 yellow\ green tag2"

我想在每个没有转义的空格之后拆分它,所以我得到了这个结果:

result[0] = "tag0"
result[1] = "tag1"
result[2] = "yellow\ green"
result[3] = "tag2"

有什么功能可以为我做到这一点吗?带有正则表达式 "[^\\] " 的 string.split() 也会删除最后一个字符,这是我想避免的。这就是我使用 string.split 和 "[^\\] " 得到的:

result[0] = "tag"
result[1] = "tag"
result[2] = "yellow\ gree"
result[3] = "tag2"

【问题讨论】:

  • 使用负前瞻,但不能保证前面的反斜杠本身不是转义的反斜杠。
  • You may use (?<!\\)\h+ 用于拆分。
  • @anubhava (?<!(?:\\{2}){0,9999}\\)\h+ 假设反斜杠可能在空格之前的反斜杠之前。
  • @AniketSahrawat 它不适用于 regex101,它是一个不同的 regex 引擎。将其复制粘贴到您的 java 代码中并转义每个反斜杠
  • @ctwheels 你是说(?<!(?<!\\)(?:\\{2}){0,9999}\\)\h+吗?

标签: java arrays regex string


【解决方案1】:

使用否定的lookbehind 可能是一种解决方法,但它不能保证前面的反斜杠本身不是转义的反斜杠。例如:

tag0 tag1 yellow\\ green tag2

如果您可以避免拆分,而是在正则表达式下方进行匹配,则会匹配预期的块:

[^\s\\]+(?:\\.[^\s\\]*)*

Live demo

细分:

  • [^\s\\]+ 匹配除空格和反斜杠以外的任何内容
  • (?:启动非捕获组
    • \\. 匹配转义字符
    • [^\s\\]* 匹配除空格和反斜杠以外的任何内容
  • )* NCG 结束,尽可能多地重复

Java:

String regex = "[^\\s\\\\]+(?:\\\\.[^\\s\\\\]*)*";
String string = "tag0 tag1 yellow\\ green tag2";

Pattern pattern = Pattern.compile(regex);
Matcher matcher = pattern.matcher(string);

while (matcher.find()) {
    System.out.println("Full match: " + matcher.group(0));
    for (int i = 1; i <= matcher.groupCount(); i++) {
        System.out.println("Group " + i + ": " + matcher.group(i));
    }
}

Java demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    相关资源
    最近更新 更多