正则表达式匹配除字母数字字符或连字符以外的任何内容
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
顺便说一句,REFind
和 REFindNoCase
一样好用,因为 alnum
包括大写和小写字母,所以不妨使用 REFind
。
更新:我看了这个问题RegEx: \w - "_" + "-" in UTF-8
经过反复试验的最终解决方案(否定必须在左括号内):
REFind('[^[:alnum:]-]', ARGUMENTS.Username)
我试图让用户注册一个仅包含字母(任何语言)、数字或连字符的用户名。我正在尝试检查用户名是否违反了此规则。
目前正在努力查明用户名是否不仅包含字母数字字符:
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
顺便说一句,REFind
和 REFindNoCase
一样好用,因为 alnum
包括大写和小写字母,所以不妨使用 REFind
。
更新:我看了这个问题RegEx: \w - "_" + "-" in UTF-8
经过反复试验的最终解决方案(否定必须在左括号内):
REFind('[^[:alnum:]-]', ARGUMENTS.Username)