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

Java 使用正则表达式拆分字符串,但在子字符串中包含部分正则表达式,java,arrays,regex,string,Java,Arrays,Regex,String,我有这样一个字符串: "tag0 tag1 yellow\ green tag2" 我想在每个未转义的空间后将其拆分,因此得到以下结果: result[0] = "tag0" result[1] = "tag1" result[2] = "yellow\ green" result[3] = "tag2" 有什么功能可以为我做到这一点吗?带有regex“[^\\]”“的函数也会删除最后一个字符,这是我想要避免的。这就是我使用string.split和“[^\\]”得到的结果: 使用负回溯可能

我有这样一个字符串:

"tag0 tag1 yellow\ green tag2"
我想在每个未转义的空间后将其拆分,因此得到以下结果:

result[0] = "tag0"
result[1] = "tag1"
result[2] = "yellow\ green"
result[3] = "tag2"
有什么功能可以为我做到这一点吗?带有regex
“[^\\]”“
的函数也会删除最后一个字符,这是我想要避免的。这就是我使用string.split和
“[^\\]”
得到的结果:


使用负回溯可能是一种变通方法,但不能保证前面的反斜杠本身不是转义反斜杠。例如:

tag0 tag1 yellow\\ green tag2
如果您可以避免拆分,而是在regex下面进行匹配,则可以匹配预期的块:

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

细分:

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

String regex=“[^\\s\\\]+(?:\\\\\.[^\\s\\\]*)*”;
String String=“tag0 tag1黄色\\绿色tag2”;
Pattern=Pattern.compile(regex);
Matcher-Matcher=pattern.Matcher(字符串);
while(matcher.find()){
System.out.println(“完全匹配:+matcher.group(0));

for(int i=1;我使用负前瞻,但不能保证前面的反斜杠本身不是转义反斜杠。用于拆分。@anubhava
(?假设反斜杠可能在空格之前的反斜杠之前。@AniketSahrawat它在regex101上不起作用,它是一个不同的regex引擎。请将它复制粘贴到java代码中,然后分别转义backslash@ctwheels你是说
(?)??
[^\s\\]+(?:\\.[^\s\\]*)*
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));
    }
}