2014-09-17 4 views
0

Может кто-то объяснить разницу между следующим регулярными выражениями:разница между регулярными выражениями

^([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$ 

и

^([a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])(\.([a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]))*$` 

Почему косяк мы используем одну группу:

[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9] 

Вместо двух показанных выше с оператором чередования?

+0

Что вы тестируете? Какова ваша ожидаемая отдача от того, что вы получаете? – JonB

+0

Поместите регулярные выражения во что-то вроде https://www.debuggex.com/, и тогда вы сможете легко увидеть разницу между ними. –

+0

@JonB это для соответствия имени хоста. – gyro

ответ

2

Давайте сделаем разница более заметным:

^ 
(
[a-zA-Z0-9]|        # Regex 1 only - matches 1 alnum character 
[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9] # Matches 2-63 characters 
) 
(
\. 
(
    [a-zA-Z0-9]|        # Regex 1 only 
    [a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9] 
) 
)* 
$ 

С чередованием,

a.a 

матчи.

Без этого это происходит не потому, что требуется как минимум две буквы/цифры до и после точки.

1
([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]{0,61}[a-zA-Z0-9]) 
^  |      ^
    |   -----------------|  | 
Allows exactly one character or atleast two characters. 

Без первого [a-zA-Z0-9] (часть перед тем |), он не допустит ни одного символа.

2

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

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

[a-zA-Z0-9](?:[a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])? 

То есть вам нужно будет сделать [a-zA-Z0-9\-]{0,61}[a-zA-Z0-9] необязательными.

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