2015-10-17 2 views
2

Я пытаюсь разрешить пользователям регистрировать имя пользователя, содержащее только буквы алфавита (любого языка), цифры или дефисы в нем. Я пытаюсь проверить, нарушает ли это имя пользовательское правило.Регулярное выражение соответствует любому, кроме буквенно-цифрового символа или дефиса

До сих пор это работает, чтобы узнать, если имя пользователя делает не содержать только буквенно-цифровые символы:

REFindNoCase('^[[:alnum:]]', ARGUMENTS.Username) 

Что хорошо, потому что если я вернусь найденный результат, то я знаю его недопустимый формат имя пользователя со специальными символами. Но я также хочу разрешить дефис. Как я мог выразить в регулярном выражении как (псевдо-код следующим образом):

REFindNoCase('^[[:alnum:]\-]', ARGUMENTS.Username) 

я могу использовать только Perl совместимого Regex, потому что я использую ColdFusion, использующие этот стандарт в основном.

+0

PCRE не Perl. Исправлены теги. – ikegami

+0

@ikegami ColdFusion поддерживает регулярные выражения, совместимые только с Perl –

+2

Это невозможно. Вероятно, он использует движок Perl Compatible Regular Expressions (PCRE), который отличается от Perl. – ikegami

ответ

4

Прежде всего, вы ошибаетесь в отношении REFindNoCase('^[[:alnum:]]', ARGUMENTS.Username) в порядке. Он проверяет, является ли первый символ буквенно-цифровым.

$ for q in Abcdef Abc123 Abc-123 Abc/123 ; do 
    if echo "$q" | grep -qP '^[[:alnum:]]' 
    then echo "$q: match" 
    else echo "$q: no match" 
    fi 
done 
Abcdef: match 
Abc123: match 
Abc-123: match 
Abc/123: match 

(grep -P использует PCRE тоже.)

Чтобы найти символ, который не является alnum характер, вы будете использовать

[^[:alnum:]] 

Как видно здесь:

$ for q in Abcdef Abc123 Abc-123 Abc/123 ; do 
    if echo "$q" | grep -qP '[^[:alnum:]]' 
    then echo "$q: match" 
    else echo "$q: no match" 
    fi 
done 
Abcdef: no match 
Abc123: no match 
Abc-123: match 
Abc/123: match 

Чтобы найти персонажа, который не является ни персонажем alnum, ни «-», вы бы использовать

[^[:alnum:]-] 

Как видно здесь:

$ for q in Abcdef Abc123 Abc-123 Abc/123 ; do 
    if echo "$q" | grep -qP '[^[:alnum:]-]' 
    then echo "$q: match" 
    else echo "$q: no match" 
    fi 
done 
Abcdef: no match 
Abc123: no match 
Abc-123: no match 
Abc/123: match 

Кстати, REFind будет работать так же, как и REFindNoCase так alnum включает в себя как прописные и строчные буквы, так могли бы также использовать REFind.

+0

Благодарим вас за предложение. Я просто решил его использовать после долгих проб и ошибок: 'REFind ('[^ [: alnum:] -]', ARGUMENTS.Username)'. Я понятия не имею, почему это работает, но единственное отличие состоит в том, что отрицание '^' находится внутри первой квадратной скобки –

+0

. Это противоположность тому, что вы просили. Это выглядит, если строка содержит символ, который не является ни «alnum», ни «-». – ikegami

+0

Как вы это понимаете? Я хочу, чтобы он соответствовал тому, где строка не содержит буквенно-цифровых символов или дефис.Который тогда, в свою очередь, указал бы мне, что имя пользователя содержит специальные символы, такие как '<>% $ £' и т. Д. –

0

Обновление: Я посмотрел на этот вопрос RegEx: \w - "_" + "-" in UTF-8

Окончательная решение после проб и ошибок (отрицание должно было быть внутри открывающей скобки):

REFind('[^[:alnum:]-]', ARGUMENTS.Username)

Смежные вопросы