我需要检查一个字符串,并确保它不包含给定字符列表之外的任何字符。
我写了一个脚本来测试这个:
str="$1"
regex="^[0-9a-zA-Z\,\!\-\^\`@\{\}\[\],=\(\).;\/~_|]*$"
if [[ "$str" =~ $regex ]]
then
echo "f yeah"
else
echo "f you"
fi
但它似乎不起作用。在我看来,我甚至都不亲近。
允许的字符列表是:
a-z A-Z 0-9` @ {} [] ^,=! ()。 ; / ~_ |
不确定我在这里缺少什么。
答案 0 :(得分:2)
通常,正则表达式中[ ... ]
内的字符没有特殊含义。在定义包含正则表达式的变量时,您需要引用几个字符以防止bash
专门处理它们,但这最容易通过单引号来完成。
regex='^[0-9a-zA-Z,!\-^`@{}[\]=().;/~_|]*$'
只有连字符(如果它不是括号表达式中的第一个或最后一个字符)和]
(如果它不是第一个字符)需要进行转义。例如:
regex='^[-0-9a-zA-Z,!^`@{}[\]=().;/~_|]*$'
regex='^[]0-9a-zA-Z,!\-^`@{}[=().;/~_|]*$'
都有效。
答案 1 :(得分:2)
正如切普纳所说,大多数"特别"如果你把它们放在一个范围内(方括号),它们会失去它们的特殊性。另外,按man re_format
:
要在列表中包含文字
]
,请将其设为第一个字符(遵循可能的^
)。要包含文字-
,请将其设置为范围的第一个或最后一个字符或第二个端点。
如果我们重新订购您的范围以符合这些规则,我希望以下工作:
regex='^[][a-zA-Z0-9`@{}^,=!().;/~_|]*$'
如果你还想要一个连字符:
regex='^[][a-zA-Z0-9`@{}^,=!().;/~_|-]*$'