2012-06-02 2 views
1

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

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

привет^world'this * имеет две лексемы

Выведите:

  • привет
  • worldthis * имеет два маркера
+0

Вы знаете, как выглядит ваш разделитель, поэтому вам не нужно регулярное выражение, вам нужно разбить строку на разделителе. Используйте правильный инструмент для правильной работы. –

+0

Не знаю, разделителем может быть любой символ, который не является алфавитом –

+0

Тогда ваша проблема плохо сформирована. Определите, что ваш разделитель, а затем разделите строку соответствующим образом. –

ответ

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

+0

Отличный ответ !!! Спасибо друг –

3

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

+1

У меня есть большая уверенность в определении регулярного выражения. См. Комментарий Джека Манее. – bmargulies

+1

Если вы считаете, что регулярные выражения не подходят для этого, можете ли вы хотя бы показать альтернативный/лучший подход? Этот ответ не поможет OP (или кому-либо еще), если вы не можете предложить что-то лучше. –

+1

ОК сказал: «Использование только регулярных выражений». Я рад поддержать ваш ответ, но я не отвечаю на такие вопросы, кроме ответа на личный вопрос. – bmargulies

1

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

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

4

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

Regex:

/(?=(([^']+'){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.

Смежные вопросы