Java Regex - разделить, но игнорировать текст внутри кавычек?

используя только методы регулярных выражений, метод String.replaceAll и ArrayList, как я могу разбить строку на токены, но игнорировать разделители, которые существуют внутри кавычек? разделитель - это любой символ, который не является буквенно-цифровым или цитируемым текстом

например: Строка:

привет^мир'это*имеет два токена'

должен вывести:

  • Привет
  • worldthis*имеет два токена

person baby boom    schedule 02.06.2012    source источник
comment
Вы знаете, как выглядит ваш разделитель, поэтому вам не нужно регулярное выражение, вам нужно разделить строку на разделитель. Используйте правильный инструмент для правильной работы.   -  person    schedule 02.06.2012
comment
Я не знаю, разделителем может быть любой символ, кроме букв   -  person baby boom    schedule 02.06.2012
comment
Тогда ваша проблема плохо сформулирована. Решите, какой у вас разделитель, а затем разделите строку соответствующим образом.   -  person    schedule 02.06.2012
comment
@babybang: Что должно произойти, если ввод содержит непревзойденную цитату? Почему кавычки отсутствуют в ожидаемом результате?   -  person Mark Byers    schedule 02.06.2012
comment
@JackManey: эта проблема не является неправильной. Немного занижено, да, но это гораздо лучше определено, чем большинство вопросов здесь.   -  person Mark Byers    schedule 02.06.2012
comment
Это совершенно невозможно ответить, как указано. Я хочу разделить строку. На что? Эммм... вещи.   -  person    schedule 02.06.2012
comment
делите на что хотите...   -  person baby boom    schedule 02.06.2012
comment
Проблема в том, что результирующий массив зависит от шаблона, по которому разбивается строка.   -  person    schedule 02.06.2012
comment
Конечно, каждое разделение строки будет иметь некоторый шаблон. Здесь шаблон разбивает его на любой небуквенно-цифровой разделитель, если этот небуквенно-цифровой разделитель не находится внутри пары одинарных кавычек. IMO, это хорошая проблема для решения, и регулярное выражение - лучший инструмент для ее решения. Пожалуйста, проверьте @MarkByers и мои ответы об использовании двух разных разновидностей регулярных выражений, чтобы получить одинаковые результаты.   -  person anubhava    schedule 02.06.2012


Ответы (4)



Я знаю, что уже есть чертовски хороший и принятый ответ, но я хотел бы добавить еще один подход, основанный на регулярных выражениях (и, могу я сказать, более простой), чтобы разделить данный текст с использованием любого небуквенно-цифрового разделителя, который не находится внутри одинарных кавычек, используя

Регулярное выражение:

/(?=(([^']+'){2})*[^']*$)[^a-zA-Z\\d]+/

Что в основном означает соответствие небуквенно-цифровому тексту, если за ним за ним следует четное количество одинарных кавычек, другими словами, соответствие небуквенно-цифровому тексту, если он не заключен в одинарные кавычки.

Код:

String string = "hello^world'this*has two tokens'#2ndToken";
System.out.println(Arrays.toString(
     string.split("(?=(([^']+'){2})*[^']*$)[^a-zA-Z\\d]+"))
);

Вывод:

[hello, world'this*has two tokens', 2ndToken]

Демонстрация:

Here is a live working Demo of the above code.

person anubhava    schedule 02.06.2012

Вы не можете никаким разумным образом. Вы ставите проблему, с которой регулярные выражения не справляются.

person bmargulies    schedule 02.06.2012
comment
Я очень верю в определение регулярного выражения. См. комментарий Джека Мани. - person bmargulies; 02.06.2012
comment
Если вы считаете, что регулярные выражения не подходят для этого, не могли бы вы хотя бы показать альтернативный/лучший подход? Этот ответ не поможет ОП (или кому-либо еще), если вы не можете предложить что-то лучшее. - person Mark Byers; 02.06.2012
comment
В OK сказано: «Используя только регулярные выражения». Я рад проголосовать за ваш ответ, но я не отвечаю на такие вопросы, кроме ответа на буквальный вопрос. - person bmargulies; 02.06.2012

Не используйте для этого регулярное выражение. Это не сработает. Вместо этого используйте/напишите парсер.

Вы должны использовать правильный инструмент для правильной задачи.

person Polygnome    schedule 02.06.2012