2013-12-02 2 views
0

У меня есть три регулярных выражений, один из каждых должны соответствовать их модели, но сейчас они совпадают больше, чем их собственная скороговорка:Проблем с регулярными выражениями матча, слишком много матчей

1. Input: test 1-2-22 
regex ^([a-z|A-Z|\s]*)(\d*)-(\d*)-(\d*)$ 
I want to capture "test", "1", "2" and "22" in groups 

2. Input: ooi 4-11-58 test^two^ one 1 two 
regex ^([a-z|A-Z|\s]*)(\d*)-(\d*)-(\d*)(.+)$ 
I want to capture "ooi", "4", "11", "58", "test^two^ one 1 two" in groups 

3. Input: one two three 3-11 four and five T1 F 
regex ^([a-z|A-Z|\s]*)(\d*)-(\d*)(.+)$ 
I want to capture "one two three", "3", "11", "four and five T1 F" in groups 

Я применяющим каждый регулярное выражение на каждая входная строка, и она должна пройти только одну из них.

Теперь случается, что регулярное выражение 1 соответствует как для 2, так и для 3 и регулярное выражение 2 соответствует одному и каждому из них друг с другом.

Как я могу исправить регулярные выражения, чтобы каждый соответствовал только их собственному шаблону?

+0

Почему вы используете '^' перед регулярным выражением? Разве это не отрицает следующее выражение (в скобках)? – yasen

+3

@yasen Нет, это означает, что «начинается с». –

+2

'[a | b]' будет соответствовать 'a',' | ',' b'. Не используйте '' 'inside' [...]', если вы не хотите, чтобы он также соответствовал '|'. – Pshemo

ответ

1
String regex_0 = "^([a-zA-Z]+)\\s+(\\d+)-(\\d+)-(\\d+)$"; 

String regex_1 = "^([a-zA-Z]+)\\s+(\\d+)-(\\d+)-(\\d+)\\s+([a-zA-Z0-9\\s]+)$" 

String regex_2 = "^([a-zA-Z\\s]+)(\\d+)-(\\d+)\\s+([a-zA-Z0-9\\s]+)$" 

Примечание: [a|b] как класс символов делает не означает "a or b", это означает "a or b or |".

Кроме того, не уверен, что вы действительно хотите * или нет, поскольку они означают любую сумму, из того, что я могу сказать, кажется, что вы хотите +, что означает один или несколько.

1

Dot . слишком разрешительный, он будет захватывать все - включая тире и цифры. Вот почему ваше третье выражение соответствует всем трем - .+ в нем соответствует "-58 test^two^ one 1 two" текст второго рисунка, или "-21" первого рисунка.

Вам нужно добавить некоторые маркеры в ваше регулярное выражение, чтобы различать шаблоны. Например, вы можете изменить ваш # 3, чтобы сказать, что первый символ .+ должно быть нечто иное, чем тире или цифры, например:

^([a-zA-Z\s]*)(\d*)-(\d*)([^\d-].*)$ 

Обратите внимание на [^\d-] группу, я добавил. В нем говорится, что первый символ в том, что был .+ в вашем выражении, должен быть не быть цифрой или тире. Это помешало бы # 3 захватить # 1 или # 2.

Также обратите внимание, что я удалил вертикальные полосы внутри класса символов, потому что он интерпретируется буквально внутри квадратных скобок.

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