Мы можем сделать это используя формальное сопоставление с образцом. Секретный ответ ответа ниже состоит в том, чтобы использовать не очень используемый метод Matcher#appendReplacement
. Мы делаем паузу в каждом совпадении, а затем добавляем произвольную замену всего, что появляется внутри двух пар кавычек. Пользовательский метод removeSpaces()
удаляет все пробелы из каждого цитируемого термина.
public static String removeSpaces(String input) {
return input.replaceAll("\\s+", "");
}
String input = "abc test=\"x y z\" magic=\" hello \" hola";
Pattern p = Pattern.compile("\"(.*?)\"");
Matcher m = p.matcher(input);
StringBuffer sb = new StringBuffer("");
while (m.find()) {
m.appendReplacement(sb, "\"" + removeSpaces(m.group(1)) + "\"");
}
m.appendTail(sb);
String[] parts = sb.toString().split("\\s+");
for (String part : parts) {
System.out.println(part);
}
abc
test="xyz"
magic="hello"
hola
Демо
Большое предостережение, как намекают вышеупомянутые комментарии, заключается в том, что мы действительно используем движок регулярных выражений в качестве элементарного синтаксического анализатора. Чтобы увидеть, где мое решение быстро не сработает, просто удалите одну из цитат случайно из цитируемого термина. Но если вы уверены, что ваш вклад правильно сформирован, как вы показали нам, этот ответ может сработать для вас.