Разрешить специальные символы, но не тогда, когда есть только специальные символы - PullRequest
0 голосов
/ 07 марта 2020

Допустим, у меня есть это:

[a-zA-Z0-9., -&:]+

, что позволяет использовать буквы алфавита c и некоторые специальные символы (запятая, точка, да sh и т. Д. c) , один или несколько раз. Но теперь я хочу разрешить эти специальные символы только в том случае, если есть также буквы alphanumeri c:

a-b, c: ok

.a:: ok

,-.: НЕ в порядке

,: НЕ в порядке

Я попробовал несколько вещей, но все еще не мог найти способ сделать это. Как мне это сделать?

Ответы [ 2 ]

2 голосов
/ 07 марта 2020

Если вы хотите убедиться, что там есть хотя бы один алфавитный символ c, вы можете просто использовать:

[a-zA-Z0-9., &:-]*[a-zA-Z0-9][a-zA-Z0-9., &:-]*

Это в основном ноль или более вашего текущего шаблона (слегка измененный (a) ), за которым следуют одна цифра c, а затем снова ноль или более вашего текущего паттерна. Это гарантирует отсутствие совпадения, если в строке нет одного или нескольких буквенно-цифровых символов.


Вы также можете рассмотреть возможность размещения маркеров ^ и $ на концах шаблона, если вы используете функцию регулярного выражения это позволяет частичное соответствие. Без этого вы могли бы сопоставить что-то вроде <some-invalid-character>A. Это может не понадобиться, если вы используете функцию «полного соответствия».


(a) Модификация, согласно комментариям в другом ответе , должен переместить - в конец регулярного выражения, чтобы он воспринимался как буквальный дефис, а не как диапазон символов.

1 голос
/ 07 марта 2020

Я бы использовал здесь чередование:

^(?=.*[A-Za-z0-9])[a-zA-Z0-9., &:-]+$

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

^                      from the start of the string
    (?=.*[A-Za-z0-9])  assert that at least one alphanumeric character be present
    [a-zA-Z0-9., &:-]+  if so, then match either alphas or certain symbols
$                      end of the string

Демо

Примечание: Обратите внимание, что в исходном классе персонажей вы поместили где-то в середину da sh:

[a-zA-Z0-9., -&:]+

Это фактически определяет диапазон символов между пробелами и &; символ дефиса не включен. Вы можете видеть в моем регулярном выражении, что я переместил da sh в конец класса, чтобы быть уверенным, что он включен как литерал.

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