Вот как я бы перевел эти правила в регулярные выражения Perl:
my $base = qr{ [!"#\$%&'()+,\-0-9;<=>\@A-Z\]_`a-z{|}] }x;
Это регулярное выражение для одного символа в разрешенном базовом наборе.Если вы хотите перевести это на другой диалект языка / регулярных выражений, обратите внимание, что $
и @
здесь экранированы только потому, что они инициируют интерполяцию переменных в Perl.
Это белый список, потому что мне кажется, что мне легче думатьо вещах таким образом.В качестве побочного эффекта это также запрещает любые символы, не относящиеся к ASCII.
Если вы хотите разрешить полный набор Unicode, с черным списком становится легче работать:
my $base = qr{ [^\x00-\x20\x1f~^:?*\[\\] }x;
(Или qr{ [^\x00-\x20\x1f~^:?*\[\\\@] | \@ (?! \{ ) }x
для версии, включающей ограничение @{
; см. Ниже.)
my $part = qr{ $base+ (?: \. $base+ )* \.? (?<! \.lock ) }x;
Это соответствует одной отделенной от косой черты части.Он реализует ограничение, согласно которому детали не могут начинаться с .
или содержать ..
или заканчиваться .lock
.
my $full_ref = qr{\A (?! \@ \z | .* \@\{ ) $part (?: / $part )+ (?<! \. ) \z}sx;
Это соответствует полному реф.Он добавляет несколько дополнительных ограничений:
Все это не может быть @
.(Это правило технически избыточно, потому что нам всегда требуется /
, но я все равно его включил.)
@{
нигде не может быть.Вместо отдельной предварительной проверки мы могли бы также изменить $base
таким образом:
my $base = qr{ [!"#\$%&'()+,\-0-9;<=>A-Z\]_`a-z{|}] | \@ (?! \{ ) }x;
Должно быть как минимум две части, разделенные /
.
Все это не может заканчиваться .
.
Перевод, например, C #, оставлен в качестве упражнения для читателя.: -)