Вот одна замена-регулярное выражение, которая работает:
\s+(?=([^"]*"[^"]*")*[^"]*$)
который заменит:
(this is a test "sentence for the regex" foo bar)
с:
(thisisatest"sentence for the regex"foobar)
Обратите внимание, что если кавычки можно избежать, то еще более подробное регулярное выражение сделает свое дело:
\s+(?=((\\[\\"]|[^\\"])*"(\\[\\"]|[^\\"])*")*(\\[\\"]|[^\\"])*$)
, который заменяет ввод:
(this is a test "sentence \"for the regex" foo bar)
с:
(thisisatest"sentence \"for the regex"foobar)
(обратите внимание, что он также работает с экранированными символами возврата: (thisisatest"sentence \\\"for the regex"foobar)
)
Само собой разумеется, (?), Это действительно не должно использоваться для выполнения такой задачи: у него кровоточат глаза, и оно выполняет свою задачу в квадратичном времени, в то время как существует простое линейное решение.
EDIT
Небольшая демонстрация:
String text = "(this is a test \"sentence \\\"for the regex\" foo bar)";
String regex = "\\s+(?=((\\\\[\\\\\"]|[^\\\\\"])*\"(\\\\[\\\\\"]|[^\\\\\"])*\")*(\\\\[\\\\\"]|[^\\\\\"])*$)";
System.out.println(text.replaceAll(regex, ""));
// output: (thisisatest"sentence \"for the regex"foobar)