Предположим, у вас есть следующая строка:
white sand, tall waves, warm sun
Легко написать регулярное выражение, которое будет соответствовать разделителям, которые метод Java String.split () может использовать для получения массива, содержащего токены "белый песок", "высокие волны" и "теплое солнце":
\s*,\s*
Теперь скажите, что у вас есть эта строка:
white sand and tall waves and warm sun
Опять же, регулярное выражение для разделения токенов легко (если вы не получите "и" внутри слова "песок"):
\s+and\s+
Теперь рассмотрим эту строку:
white sand, tall waves and warm sun
Можно ли написать регулярное выражение, которое будет правильно соответствовать разделителям, что позволит вам разбить строку на те же токены, что и в предыдущих двух случаях? Кроме того, можно ли написать регулярное выражение, которое будет соответствовать самим токенам и опускать разделители? (Любое количество пробелов по обе стороны от запятой или слова «и» следует считать частью разделителя.)
Редактировать: Как было указано в комментариях, правильный ответ должен надежно обрабатывать разделители в начале или конце входной строки. идеальный ответ должен быть в состоянии взять строку типа «белый песок, высокие волны и теплое солнце и» и предоставить три точных жетона:
[ "white sand", "tall waves", "warm sun" ]
... без дополнительных пустых токенов или дополнительных пробелов в начале или конце любого токена.
Edit: было отмечено, что дополнительные пустые токены неизбежны с String.split (), поэтому он был удален как критерий для "идеального" регулярного выражения.
Спасибо всем за ваши ответы! Я пытался убедиться, что проголосовал за каждого, кто внес работоспособное регулярное выражение, которое по сути не было дубликатом. Ответ Дэна был самым надежным (он даже обрабатывает ", белый песок, высокие волны и теплое солнце и" разумно, с этим странным запятым после слова "волны"), поэтому я отметил его как принятый ответ. Регулярное выражение, предоставленное nsayer, было второй секундой.