使用正则表达式拆分字符串,但在子字符串中包含正则表达式的一部分

时间:2018-03-20 15:11:55

标签: java arrays regex string

我有一个这样的字符串:

"tag0 tag1 yellow\ green tag2"

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

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

有什么功能可以帮我吗?带有正则表达式"[^\\] "的{​​{3}}也删除了最后一个字符,我想避免使用它。这是我用string.split和"[^\\] "得到的:

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

1 个答案:

答案 0 :(得分:1)

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

tag0 tag1 yellow\\ green tag2

如果你可以避免分裂,而是在下面进行匹配,那么regex会匹配预期的块:

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

Live demo

故障:

  • [^\s\\]+匹配除空格和反斜杠之外的任何内容
  • (?:启动非capturin组
    • \\.匹配转义字符
    • [^\s\\]*匹配除空格和反斜杠之外的任何内容
  • )* NCG结束,重复次数

爪哇:

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