При попытке сопоставить что-то, что может содержаться внутри чего-то другого, может быть полезно создать регулярное выражение, которое соответствует обоим, например:
("[^"\\]*(?:\\.[^"\\]*)*")|( +)
Это будет соответствовать строка в кавычках или два или более пробелов. Поскольку два выражения объединены, оно будет соответствовать строке в кавычках ИЛИ двум или более пробелам, но не пробелам в кавычках. Используя это выражение, вам нужно проверить каждое совпадение, чтобы определить, является ли оно строкой в кавычках или двумя или более пробелами, и действовать соответственно:
Pattern spaceOrStringRegex = Pattern.compile( "(\"[^\"\\\\]*(?:\\\\.[^\"\\\\]*)*\")|( +)" );
StringBuffer replacementBuffer = new StringBuffer();
Matcher spaceOrStringMatcher = spaceOrStringRegex.matcher( text );
while ( spaceOrStringMatcher.find() )
{
// if the space group is the match
if ( spaceOrStringMatcher.group( 2 ) != null )
{
// replace with a single space
spaceOrStringMatcher.appendReplacement( replacementBuffer, " " );
}
}
spaceOrStringMatcher.appendTail( replacementBuffer );