如何检查一个字符串是否只包含 A-Z、a-z 和 0-9?

4
什么是验证字符串模式的最佳方法?我会使用PCRE,但我不知道它是否嵌入到每个shell中以及如何使用它。
例如,我该如何验证变量仅包含A-Z、a-z和0-9,并且不包含空格、'、"等字符?

1
通常在bash中,您会非常依赖使用grepawk来进行任何模式匹配。 - Chris Eberle
4个回答

13
$ [[ "foo" =~ ^[A-Za-z0-9]*$ ]] ; echo $?
0
$ [[ "foo " =~ ^[A-Za-z0-9]*$ ]] ; echo $?
1

3
if `echo $VARIABLE | egrep '[^A-Za-z0-9]'`; then echo VARIABLE IS BAD; fi

一个纯shell选项
case "$VARAIBLE" in *[^A-Za-z0-9]*) echo VARIABLE IS BAD;; esac

3

几个更正:外部双括号之间不能有空格,[:alnum:]需要另一组括号,并且应该跟随*以使其匹配多个字符。修正版本:if [[ "$VARIABLE" =~ ^[[:alnum:]]*$ ]]; then do something; fi - Gordon Davisson
感谢您纠正语法错误。已更新以避免混淆。 - Martin
小心处理这个。$ [[ "一" =~ ^[[:alnum:]]*$ ]] ; echo $? 0 - Ignacio Vazquez-Abrams
@Ignacio:这对我来说打印出1(如预期)。在其他语言环境中是否属于alnum字符类(我正在使用LANG=en_US.UTF-8)? - Gordon Davisson
1
如果你的bash使用Unicode类,则它将为真,因为在日语中是“1”。 - Ignacio Vazquez-Abrams

-1

唯一可移植的方式(没有bash垃圾):

`[ "${var%%*[^A-Za-z0-9]*}" ]`

请注意,不会启动任何外部程序,因此这比使用grep等解决方案更高效。
请注意,字符类通常(不仅在shell中)与区域设置相关。
var=ä
[ "${var%%*[^a-z]*}" ] && echo match  # prints "match"

所以你可能想要考虑暂时将区域设置为"C",或自己创建该类。
`[ "${var%%*[^abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789]*}" ]`

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接