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

1

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

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

hello^world'this*has two tokens'

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

  • hello
  • worldthis*has two tokens
@babybang: Что должно произойти, если вход содержит несоответствующую кавычку? Почему цитаты отсутствуют в ожидаемом результате? Mark Byers
Тогда ваша проблема плохо сформирована. Решите, какой у вас разделитель, а затем разбейте строку соответствующим образом. user554546
Вы знаете, как выглядит ваш разделитель, поэтому вам не нужно регулярное выражение, вам нужно разбить строку на разделителе. Используйте правильный инструмент для правильной работы. user554546
@JackManey: эта проблема не является "плохо сформированной". Да, немного недооценено, но уточняется гораздо лучше, чем большинство вопросов здесь. Mark Byers
Я не знаю, что разделителем может быть любой символ, который не является алфавитом baby boom

Ваш Ответ

4   ответа
1

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

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

3

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

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Если вы думаете, что регулярные выражения не подходят для этого, вы могли бы по крайней мере показать альтернативный / лучший подход? Этот ответ не поможет ОП (или кому-либо еще), если вы не можете предложить что-то лучшее.
3

ИспользоватьMatcher чтобы определить части, которые вы хотите сохранить, а не части, на которые вы хотите разделить:

String s = "hello^world'this*has two tokens'";
Pattern pattern = Pattern.compile("([a-zA-Z0-9]+|'[^']*')+");
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
    System.out.println(matcher.group(0));
}

Посмотрите, как работает онлайн:ideone

Error: User Rate Limit Exceeded baby boom
4

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

Regex:

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

Что в основном означает совпадение с не алфавитно-цифровым текстом, если этоfollowed by even number of single quotes другими словами, соответствует не алфавитно-цифровому тексту, если он находится вне одинарных кавычек.

Code:

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

Output:

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

Demo:

Here is a live working Demo of the above code.

Похожие вопросы