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

Regex to match anything but an alphanumeric character or a hyphen

我试图让用户注册一个仅包含字母(任何语言)、数字或连字符的用户名。我正在尝试检查用户名是否违反了此规则。

目前正在努力查明用户名是否仅包含字母数字字符:

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

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

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

我只能使用 Perl 兼容的正则表达式,因为我使用的是 ColdFusion,它主要使用该标准。

首先,您认为 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

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

经过反复试验的最终解决方案(否定必须在左括号内):

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