2013-02-12 3 views
1

Представьте захватывая вход с регулярным выражением:Java Regex подходит для конкретной строки или другой конкретной строки или вообще нет?

2.1_3_4 
3.2.1 
3.2.1.RELEASE 
3.2.1.SNAPSHOT 

Числа и точки являются достаточно легко получить

([0-9\._]+) 

Но как захватить, что плюс «RELEASE» или «SNAPHOT» или ничего из тех?

Я играл с или оператором без толка ...

([0-9\._]+RELEASE||SNAPSHOT) // no worky 

Кстати, это хороший тестер регулярных выражений: http://java-regex-tester.appspot.com/

ответ

5

Я думаю, что вы хотите:

([0-9._]+(RELEASE|SNAPSHOT)?) 

(внутри) parens образуют группу, а знак вопроса указывает, что группа может встречаться 0 или 1 раз.

+0

Возможно '(: RELEASE | ПАНОРАМА)?', Чтобы избежать внутренняя матчевая группа. – pickypg

+2

@pickypg Ваш бы избежать совпадения внутренней группы совпадений, но я думаю, что операционная система хочет эту группу. Возможно, оп мог бы прояснить. –

+1

Согласен, но, основываясь на его первоначальной попытке и «плюсе» RELEASE »или« SNAPHOT », я подозреваю, что он хочет в основном обеспечить, чтобы он прошел и получил все это. (Хотя стоит отметить, что '...._ RELEASE' будет соответствовать, чего он может и не ожидать) – pickypg

1

Вы отлично себя чувствуете. Вам просто нужно внести несколько изменений.
Во-первых, вы не используете || для или, |. Таким образом, RELEASE||SNAPSHOT будет конвертировать в RELEASE|SNAPSHOT.
Поскольку выпуск или моментальный снимок не является обязательным, после него следует разместить ?. Таким образом, окончательный регулярное выражение становится

([0-9\._]+(RELEASE|SNAPSHOT)?) 

Вы также можете использовать \d вместо 0-9. иначе, чем это, нет никакой необходимости, чтобы избежать . от \, когда его присутствует внутри []
Итак, наконец, после может быть окончательным регулярное выражение

([\d._]+(RELEASE|SNAPSHOT)?) 
Смежные вопросы