Сложное (?) Регулярное выражение: это выражение, но не другое - PullRequest
1 голос
/ 12 июня 2010

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

Привет,

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

^[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, мой Regid ex соответствия 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}$

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

Ответы [ 3 ]

6 голосов
/ 12 июня 2010

Вы можете просто использовать отрицательное прогнозное утверждение .

(?!YourGuidExpression)YourOtherExpression
3 голосов
/ 12 июня 2010

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

^(?!([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 голосов
/ 13 июня 2010

Я бы предложил использовать оба регулярных выражения, а не комбинировать их.Это будет легче поддерживать, а также быстрее в большинстве случаев.Как то так:

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;
}
...