2010-06-12 4 views
1

(Если вы можете сделать лучше название, пожалуйста)комплекса регулярных выражений: Является ли выражение, но не другой

Привет,

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

^[0-9a-zA-Z]{1}[0-9a-zA-Z\.\-_]*$ 
(Starts with a letter or number, then any number of letters, numbers, dots, dashes or underscores) 

Но, учитывая, что мне нужно, чтобы убедиться, что он не соответствует Guid, мой Guid соответствия рег-ех выглядит следующим образом (это, очевидно, должно быть сведены на нет в результате объединенном):

^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$ 

Последнее требование здесь состоит в том, что они должны (если это возможно) быть объединены в одно выражение.

+1

Какой язык вы используете? –

ответ

3

Самый простой способ сделать это, если ваш язык поддерживает его, является использование negative lookahead:

^(?!([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$)[0-9a-zA-Z]{1}[0-9a-zA-Z\.\-_]*$ 
0

Я предложил бы использовать как регулярные выражения, а не объединяя их. В большинстве случаев это будет легче поддерживать, а также быстрее. Что-то вроде этого:

if (m/^[0-9a-zA-Z]{1}[0-9a-zA-Z\.\-_]*$/) { 
    my $m = $&; 
    if ($m =~ m/^([0-9a-fA-F]){8}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){4}-([0-9a-fA-F]){12}$/) { 
    return null; 
    } else { 
    return $m; 
    } 
} else { 
    return null; 
}