我试图允许用户注册一个只包含字母(任何语言),数字或连字符的用户名。我试图检查用户名是否违反此规则。
到目前为止,我们正在努力查明用户名不是否仅包含字母数字字符:
REFindNoCase('^[[:alnum:]]', ARGUMENTS.Username)
这很好,因为如果我找回找到的结果,那么我知道它的用户名格式无效,其中包含特殊字符。但我也想通过连字符。我怎么能在正则表达式中表达(伪代码跟随):
REFindNoCase('^[[:alnum:]\-]', ARGUMENTS.Username)
我只能使用Perl兼容的Regex,因为我使用的ColdFusion主要使用该标准。
答案 0 :(得分: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
。
答案 1 :(得分:0)
更新:我查看了这个问题RegEx: \w - "_" + "-" in UTF-8
经过试验和错误的最终解决方案(否定必须在开头括号内):
REFind('[^[:alnum:]-]', ARGUMENTS.Username)