2015-07-14 5 views
3

У меня есть следующий текстRegex группы захвата путаница

31 июл 2015 - Отправление 2 остановки Общее время в пути: 20 ч 40 м
26 августа 2015 - Возвращение 1 остановка Общее время в пути: 19 ч 0 м Чикаго
безостановочно

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

Я написал это регулярное выражение (\d)(?:\Wstops?)|(nonstop)

Это делает то, что я хочу, но, как вы видите, она состоит из двух групп захвата (группа # 1 для цифр и групп № 2 для «нон-стоп»), это может быть сделано с одной группой захвата?

Мой другой вопрос, можно ли непосредственно возвращать «безостановочно», как 0, используя регулярное выражение, вместо обработки текста в коде позже?

Вот живой демо моего регулярного выражения: regex101

ответ

4

Вы должны использовать положительный lookahead assertion.

Matcher m = Pattern.compile("\\d(?=\Wstops?)|nonstop").matcher(s); 
while(m.find()) 
{ 
System.out.println(m.group()); 
} 
  • \\d(?=\Wstops?) соответствует всем цифрам, только если за ним следует не-символ слова снова следует строки stop или stops

  • | ИЛИ

  • nonstop матч строка nonstop

+0

Спасибо, это то, что я искал. Ум объясняет положительное утверждение? Или связать какой-то материал? Я еще не знаком с регулярным выражением. Спасибо Радж! – prettyvoid

+0

Любой разум объясняет, почему '(\ d (?: \ Wstops?))' Получает «5 остановок» в качестве соответствия, в то время как «остановки» находятся внутри группы, не связанной с захватом? Как объяснялось, я должен использовать прогнозное утверждение, но я все еще смущен. Является ли вложение группы, не захваченной в группу захвата, неправильной или бессмысленной? – prettyvoid

+1

@prettyvoid, но все было внутри группы захвата. Объясните, спросите, есть ли какие-то дополнительные сомнения. –

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