正则表达式 - 脚本检查允许的字符

时间:2015-11-24 13:24:14

标签: regex bash shell

我需要检查一个字符串,并确保它不包含给定字符列表之外的任何字符。

我写了一个脚本来测试这个:

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` @ {} [] ^,=! ()。 ; / ~_ |

不确定我在这里缺少什么。

2 个答案:

答案 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`@{}^,=!().;/~_|-]*$'