Ato*_*lan 59 regex bash if-statement
我在这做错了什么?
尝试匹配包含空格,小写,大写或数字的任何字符串.特殊字符也会很好,但我认为这需要转义某些字符.
TEST="THIS is a TEST title with some numbers 12345 and special char *&^%$#"
if [[ "$TEST" =~ [^a-zA-Z0-9\ ] ]]; then BLAH; fi
Run Code Online (Sandbox Code Playgroud)
这显然只测试上,下,数字和空格.虽然不起作用.
*更新*
我想我应该更具体一点.这是实际的实际代码行.
if [[ "$TITLE" =~ [^a-zA-Z0-9\ ] ]]; then RETURN="FAIL" && ERROR="ERROR: Title can only contain upper and lowercase letters, numbers, and spaces!"; fi
Run Code Online (Sandbox Code Playgroud)
*更新*
./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'
Run Code Online (Sandbox Code Playgroud)
ric*_*ici 138
关于bash的[[ ]]构建有几个重要的事情需要了解.首先:
字分裂和路径的扩展不上之间的字进行
[[和]]; 执行波形扩展,参数和变量扩展,算术扩展,命令替换,进程替换和引用删除.
第二件事:
另一个二元运算符'=〜'可用,...运算符右侧的字符串被视为扩展正则表达式并相应匹配... 可以引用模式的任何部分以强制匹配作为一个字符串.
因此,$v在任何一侧=~将扩展为该变量的值,但结果将不会被分词或路径名扩展.换句话说,在左侧保留变量扩展是非常安全的,但是您需要知道变量扩展将在右侧发生.
因此,如果你写:[[ $x =~ [$0-9a-zA-Z] ]],在$0解释正则表达式之前,右边的正则表达式内部将被扩展,这可能会导致正则表达式无法编译(除非$0用ascii值小于的数字或标点符号结束扩展一个数字).如果你引用右侧的那样[[ $x =~ "[$0-9a-zA-Z]" ]],那么右侧将被视为普通字符串,而不是正则表达式(并且$0仍将被扩展).在这种情况下你真正想要的是[[ $x =~ [\$0-9a-zA-Z] ]]
类似地,在解释正则表达式之前,[[和之间的表达式]]被分成单词.因此正则表达式中的空格需要被转义或引用.如果你想匹配字母,数字或空格,你可以使用:[[ $x =~ [0-9a-zA-Z\ ] ]].其他角色同样需要进行转义,例如#,如果没有引用则会启动评论.当然,您可以将模式放入变量中:
pat="[0-9a-zA-Z ]"
if [[ $x =~ $pat ]]; then ...
Run Code Online (Sandbox Code Playgroud)
对于包含许多需要转义或引用以通过bash词法分析器的字符的正则表达式,许多人更喜欢这种风格.但要注意:在这种情况下,您不能引用变量扩展:
# This doesn't work:
if [[ $x =~ "$pat" ]]; then ...
Run Code Online (Sandbox Code Playgroud)
最后,我认为你要做的是验证变量只包含有效字符.执行此检查的最简单方法是确保它不包含无效字符.换句话说,这样的表达式:
valid='0-9a-zA-Z $%&#' # add almost whatever else you want to allow to the list
if [[ ! $x =~ [^$valid] ]]; then ...
Run Code Online (Sandbox Code Playgroud)
!否定测试,将其变为"不匹配"运算符,[^...]正则表达式字符类表示"除..." 之外的任何字符".
参数扩展和正则表达式运算符的组合可以使bash正则表达式语法"几乎可读",但仍然存在一些问题.(是不是总有?)其中一个是,你不能把]进入$valid,即使$valid是引用,除了在开始的时候.(这是一个POSIX正则表达式规则:如果你想包括],在字符类,它需要去一开始-可以去在开始或结束,所以如果你需要同时]和-,你需要开始]和结束-,导致正则表达式"我知道我在做什么"表情:[][-])
Oli*_*ain 13
万一有人想要一个使用变量的例子......
#!/bin/bash
# Only continue for 'develop' or 'release/*' branches
BRANCH_REGEX="^(develop$|release//*)"
if [[ $BRANCH =~ $BRANCH_REGEX ]];
then
echo "BRANCH '$BRANCH' matches BRANCH_REGEX '$BRANCH_REGEX'"
else
echo "BRANCH '$BRANCH' DOES NOT MATCH BRANCH_REGEX '$BRANCH_REGEX'"
fi
Run Code Online (Sandbox Code Playgroud)
kon*_*box 11
我更喜欢用[:punct:]它.此外,a-zA-Z09-9可能只是[:alnum:]:
[[ $TEST =~ ^[[:alnum:][:blank:][:punct:]]+$ ]]
Run Code Online (Sandbox Code Playgroud)