Убедитесь, что строка содержит определенные c символов, каждый не более одного раза - PullRequest
1 голос
/ 06 января 2020

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

Пример:

Учитывая $valid = 'ABCDE', следующее Строки:

$a = ''; // valid, empty
$b = 'CE'; // valid, only contains C and E, each once
$c = 'AZ'; // invalid, contains Z
$d = 'DAA'; // invalid, contains A twice

Есть ли быстрый способ сделать это (возможно) с помощью регулярных выражений?

1 Ответ

3 голосов
/ 06 января 2020

Мы можем попробовать использовать следующий шаблон регулярных выражений:

^(?!.*(.).*\1)[ABCDE]{0,5}$

Вот объяснение регулярного выражения:

^                    from the start of the string
    (?!.*(.).*\1)    assert that the same letter does not repeat
    [ABCDE]{0,5}     then match 0-5 letters
$                    end of the string

Пример PHP скрипт:

$input = "ABCDE";
if (preg_match("/^(?!.*(.).*\1)[ABCDE]{0,5}$/", $input)) {
    echo "MATCH";
}

Отрицательный взгляд (?!.*(.).*\1) работает, проверяя, может ли он захватить какую-то одну букву, а затем снова находит ее в строке. Давайте возьмем недопустимый ввод ОП DAA. Вышеуказанный негативный прогноз потерпит неудачу, когда он совпадет с , а захватит первый A, а затем увидит его снова. Обратите внимание, что у обходных путей могут быть свои собственные группы захвата.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...