正则表达式匹配除字母数字字符或连字符之外的任何内容

时间:2015-10-17 22:56:37

标签: regex coldfusion pcre

我试图允许用户注册一个只包含字母(任何语言),数字或连字符的用户名。我试图检查用户名是否违反此规则。

到目前为止,我们正在努力查明用户名是否仅包含字母数字字符:

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

这很好,因为如果我找回找到的结果,那么我知道它的用户名格式无效,其中包含特殊字符。但我也想通过连字符。我怎么能在正则表达式中表达(伪代码跟随):

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

我只能使用Perl兼容的Regex,因为我使用的ColdFusion主要使用该标准。

2 个答案:

答案 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

顺便说一下,REFindREFindNoCase一样有效,因为alnum包含大写和小写字母,所以不妨使用REFind

答案 1 :(得分:0)

更新:我查看了这个问题RegEx: \w - "_" + "-" in UTF-8

经过试验和错误的最终解决方案(否定必须在开头括号内):

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