2015-12-01 3 views
0

У меня есть строка, содержащая, например. 1A2B. Число от 1 до 9, а буква (a | b) постоянна. Я хочу регулярное выражение, которое ищет «1a» и «2b», где любая группа является необязательной.regex - необязательно захватить 2 группы

Я это ...

String description = "bla bla bla: 1a2b more bla bla bla"; 
    Pattern pattern = Pattern.compile("([1-9]a)([1-9]b)"); 
    Matcher matcher = pattern.matcher(description); 
    if (matcher.find()) { 
     System.out.println(" group1: " + matcher.group(1)); 
     System.out.println(" group2: " + matcher.group(2)); 
    } else { 
     System.out.println("no match"); 
    } 

, который выводит

group1: 1a 
group2: 2b 

Если добавить ? после ОБЕИМ группы она все еще работает. Если я добавлю ? после BOTH, он по-прежнему совпадает, но возвращает null для обеих групп.

Как сделать обе группы необязательно так, что он будет соответствовать

случай 1: "бла-1a бла"

случай 2: "бла 2б бла"

случай 3: «бла 1A2B bla " ?

+0

Вы пробовали '|' –

+1

Просто быстрый вопрос: почему бы не использовать '([1-9]?) ([ab])'? «a» и «b» постоянны, поэтому цифра может отсутствовать. –

+0

Один, другой или оба: '([1-9] a) | ([1-9] b) | ([1- 9] a) ([1-9] b) ' – Shloim

ответ

1

Я вижу два возможных способа сделать это:

  1. Имея одну группу дважды:

    Если вы используете "([1-9]a)([1-9]b)?|([1-9]b)", это будет соответствовать тому, что вы хотите, но вы должны проверить обе группы 2 и 3, чтобы найти деталь с b.

  2. Использование предпросмотр

    В регулярном выражении "(?=[1-9][ab])([1-9]a)?([1-9]b)?", первый положительный предпросмотр будет гарантировать, что один из двух следующих групп будет соответствовать, то обе группы получают свой шанс на согласование.

Решение 1 более компактен (не все регулярные выражения двигатели поддержки предпросмотр) и, возможно, немного быстрее (и легче понять, для большинства), но требует изменения в использовании групп (вы должны проверить, если группа 2 (или группа 1) равна null и использовать в этом случае группу 3.

+1

Спасибо. 1. работает для меня. Я приму этот ответ если никто не может дать ответ без трубы. – TedTrippin

+0

@TedTrippin Это не труба, это логично ИЛИ –

+1

Поиск «вертикальной полосы» на википедию. – TedTrippin

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