【发布时间】:2013-09-13 15:13:34
【问题描述】:
我在这里做错了什么?
尝试匹配任何包含空格、小写字母、大写字母或数字的字符串。特殊字符也不错,但我认为这需要转义某些字符。
TEST="THIS is a TEST title with some numbers 12345 and special char *&^%$#"
if [[ "$TEST" =~ [^a-zA-Z0-9\ ] ]]; then BLAH; fi
这显然只测试大写、小写、数字和空格。还是不行。
* 更新 *
我想我应该更具体一些。这是真正的代码行。
if [[ "$TITLE" =~ [^a-zA-Z0-9\ ] ]]; then RETURN="FAIL" && ERROR="ERROR: Title can only contain upper and lowercase letters, numbers, and spaces!"; fi
* 更新 *
./anm.sh: line 265: syntax error in conditional expression
./anm.sh: line 265: syntax error near `&*#]'
./anm.sh: line 265: ` if [[ ! "$TITLE" =~ [a-zA-Z0-9 $%^\&*#] ]]; then RETURN="FAIL" && ERROR="ERROR: Title can only contain upper and lowercase letters, numbers, and spaces!"; return; fi'
【问题讨论】:
-
您实际使用的是哪个外壳? /bin/sh? /bin/bash? /bin/csh?
-
将正则表达式放在变量中更安全。
re='...whatever...'; [[ $string =~ $re ]](不带引号——这是一种罕见的情况,他们会破坏没有引号的东西)。 -
请在作业两边加上单引号。双引号不能正确保护特殊字符。
-
非常感谢查尔斯!不把它放在一个变量中还是可以的,但它绝对不能被引用!例如:
[[ $var =~ .* ]]匹配正则表达式.*(任何东西)。我猜如果你使用引号,引号本身被认为是正则表达式的一部分...... -
我发现的问题总结:(1.) 如果您需要正则表达式匹配,请在双平方表达式中使用单引号
pattern='^hello[0-9]*$'(2.) 将模式保存在变量中,不要引用模式 因为引用禁用正则表达式模式匹配。 (即表达式[[ "$x" =~ $pattern ]]将使用正则表达式匹配,而表达式[[ "$x" =~ "$pattern" ]]禁用正则表达式匹配,等效于[[ "$x" == "$pattern" ]])。
标签: regex bash if-statement