正则表达式拆分除指定子字符串外的字符串

Regex to split string except specified substring

我目前正在尝试通过 Java 中的空格拆分字符串,除了第一个和最后一个双引号之间的所有内容(这是一个特定的情况,它们保证存在)。我是正则表达式的新手,但这是我在第一个和最后一个引号中找到子字符串的方法:

regex = ((?<=\").*(?=\"))

我已经在 https://regex101.com 上测试过了,对结果很满意。 但是现在当我尝试像下面这样拆分我的输入字符串时:

String input = "apple \"banana\"";
String[] arr = input.split("\s+((?<=\").*(?=\"))");

它没有做真正的分裂。 这是预期的输出:

arr[0] == "apple", arr[1] == "banana"

我收到的输出:

arr[0] == "apple \"banana\""

我在这里错过了什么?任何指导将不胜感激。

编辑:@WiktorStribiżew 在评论中给出了答案。

非常感谢所有提供帮助的人,尤其是@WiktorStribiżew 干杯!

您应该匹配这些字符串,这是一个可能的解决方案:

String input = "apple \"banana\"";
Pattern p = Pattern.compile("\"([^\"]*)\"|\S+");
Matcher m = p.matcher(input);
List<String> results = new ArrayList<>(); // Declare a list
while (m.find()) {
    if (m.group(1) != null) {
        results.add(m.group(1));  // Add Group 1 to the list
    } else {
        results.add(m.group());   // Add the whole match value to the list
    }
}
System.out.println(results);      // Prints the resulting list

注意:如果您打算匹配第一个匹配的 " 到最后一个 " 之间的所有字符,您可以使用 Pattern p = Pattern.compile("\"(.*)\"|\S+"); .

参见Java demo online

输出:

apple
banana

"([^"]*)"|\S+ 模式 matches:

  • " - 一个 " 字符
  • ([^"]*) - 第 1 组:除 "
  • 之外的任意 0 个或更多字符
  • " - 一个 " 字符
  • | - 或
  • \S+ - 1+ 个非空白字符。
"\s*\"++|\s++"

苹果“香蕉”' => 2 [[苹果,香蕉]]