只允许一些带grep的字符?

时间:2012-02-27 16:29:59

标签: regex linux bash grep

我想检查字符串,因此它只包含字符0-9 a-z -

当我这样做时

regex='[-a-z0-9]*'
string='abcd!'
if [[ $string =~ $regex ]]
then 
    echo "valid"
else
    echo "not valid"
fi

它输出valid,我预期not valid,因为$string包含!

2 个答案:

答案 0 :(得分:4)

试试这个:regex='^[-a-z0-9]*$'。它将强制整行与此类匹配。否则,只有一个匹配或根本没有匹配(由于*)将返回有效。 ^...$表示字符串的开头和结尾没有任何匹配的内容。

答案 1 :(得分:1)

您必须为此正则表达式添加边界才能工作。

'[ - a-z0-9] *'表示:在字符串中的任何位置匹配这些字符0次或更多次。

因此,在正则表达式中添加行尾字符可以满足您的需求:

regex='^[-a-z0-9]*$'

下一步是将' - '的出现次数限制为仅一次。破折号字符可以出现在字符串的开头还是结尾?如果没有尝试:

regex='^[a-z0-9]*-?[a-z0-9]*$'

希望这有帮助。