Regex непоследовательные символы - PullRequest
1 голос
/ 19 января 2011

В настоящее время у меня есть:

[A-Za-z0-9._%+-]

Это соответствует любой строке, которая содержит буквы, цифры и определенные специальные символы (._%+-)

Как я могу изменить это так, чтобы он выигралНе соответствует строка, которая содержит специальные символы последовательно?

Например, я хочу, чтобы она соответствовала: foo.bar+test и foo.+bar и +foo.

Но не: foo..bar+testили foo.bar++test или foo.bar++

Ответы [ 4 ]

6 голосов
/ 19 января 2011

Если ваш инструмент / язык поддерживает заглядывание в будущее, попробуйте:

^(?!.*([._%+-])\1)[A-Za-z0-9._%+-]+$
4 голосов
/ 19 января 2011
^(?:[0-9A-Za-z]+|([._%+-])(?!\1))+$

Разбит:

  • (?:)+ - один или несколько из либо :
    • [0-9A-Za-z]+ - один илибольше буквенно-цифровых символов или
    • ([._%+-]) - любые разрешенные не алфавитно-цифровые
      • (?!\1) - за которыми не следует точно такой же символ

Позволяет:

  • foo
  • foo.+bar
  • -700.bar+baz

Запрещает:

  • foo..bar
  • foo.+bar--baz

Работает путем захвата совпадающих буквенно-цифровых символов впервая обратная ссылка (\1) каждый раз, когда внешняя группа без захвата сопоставляется и использует отрицательный прогноз ((?!)), чтобы убедиться, что один и тот же символ не появляется дважды в строке.Имейте в виду, что не все регулярные выражения поддерживают негативный прогноз!

1 голос
/ 19 января 2011

Как насчет этого:

^(?!.*[._%+-]{2})[\w.%+-]+$

Если нельзя повторить только один и тот же символ, используйте:

^(?!.*([._%+-])\1)[\w.%+-]+$
0 голосов
/ 19 января 2011

Используя PHP PCRE, вы можете сделать это:

/^([A-Za-z0-9]|([._%+-])(?!\2))*$/

\2 - это обратная ссылка, необходимая для обнаружения повторного использования одного и того же символа.Я не уверен, что это можно сделать без прямого утверждения и обратной ссылки, поэтому мое рабочее регулярное выражение проверено на:

'foo'         => true,
'bar.baz'     => true,
'bar.biz.buz' => true,
'bar.+bar'    => true,
'bar..bar'    => false,
'biz.baz..'   => false,
'..++..'      => false,
'.faf.'       => true,
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...