Regex Bash脚本,if语句中的正则表达式
我对bash脚本和regexp非常陌生,有一个问题。 我想检查变量Regex Bash脚本,if语句中的正则表达式,regex,bash,Regex,Bash,我对bash脚本和regexp非常陌生,有一个问题。 我想检查变量$name是否以a-d、e-h、I-l等开头,并相应地执行一些操作。如果字符串以“the.”或“the.”开头,则应检查句点后的第一个字母 我的问题是,如果$name由“the.anchor”组成,那么a-d0-9和q-t都是真的。你们知道怎么了吗 if [[ $name =~ ^([tT]he\.)?[a-dA-D0-9]+ ]]; then do some stuff fi if [[ $name =~ ^([tT]
$name
是否以a-d、e-h、I-l等开头,并相应地执行一些操作。如果字符串以“the.”或“the.”开头,则应检查句点后的第一个字母
我的问题是,如果$name
由“the.anchor”组成,那么a-d0-9和q-t都是真的。你们知道怎么了吗
if [[ $name =~ ^([tT]he\.)?[a-dA-D0-9]+ ]]; then
do some stuff
fi
if [[ $name =~ ^([tT]he\.)?[e-hE-H]+ ]]; then
do some stuff
fi
if [[ $name =~ ^([tT]he\.)?[i-lI-L]+ ]]; then
do some stuff
fi
if [[ $name =~ ^([tT]he\.)?[m-pM-P]+ ]]; then
do some stuff
fi
if [[ $name =~ ^([tT]he\.)?[q-tQ-T]+ ]]; then
do some stuff
fi
if [[ $name =~ ^([tT]he\.)?[u-wU-W]+ ]]; then
do some stuff
fi
if [[ $name =~ ^([tT]he\.)?[x-zX-Z]+ ]]; then
do some stuff
fi
提前谢谢 您的第一部分是可选的:
([tT]he\.)?
因此,the.anchor
匹配模式^([tT]he\)?[a-dA-D0-9]+
,因为the.
匹配`([tT]he\)?
而a
匹配[a-dA-D0-9]+
。它匹配^([tT]he\)?[q-tQ-T]+
,因为^([tT]he\)?
是可选的T
匹配[q-tQ-T]+
。注意,并不是第二个模式消耗了整个输入,实际上只有第一个字符被抓取
您可以通过让bash回显匹配来验证这一点:
echo "${BASH_REMATCH[0]}"
它应该在第一种情况下打印.anchor,在第二种情况下打印t
模式上没有端点锚定,因此只需要匹配部分输入。如果您制作了第二个模式^([tT]he\)?[q-tQ-T]+$
,则它将不匹配
或者,您可以将第一部分设为所有格-
^([tT]he\)?+
。这意味着,如果引擎与第一个表达式匹配,它将不会不匹配。在后一种情况下,当[q-tQ-T]+
失败时,+将抓取的.
,然后不释放它;这将导致匹配失败。我找到了一种方法来解决我的问题,方法是使用elif语句并将q-t部分作为最后一个我认为?
可以作为删除,如果语句已经在进行测试。+
与前面的项目至少匹配一次,并且仅当您要匹配多个字母实例时才需要
您可以这样做:
if [[ $name =~ ^[tT]he\.[a-dA-D0-9] ]]; then
do some stuff
fi
只有当^[tT]he\.
后面的第一个字符是[a-dA-D0-9]
时,条件才会返回true
然而,我倾向于认为,在将字符列表与变量进行匹配时,case
比if
语句更干净
case $name in
[tT]he\.[a-dA-D0-9]*)
do some stuff
;;
esac
谢谢你的回答。如果我将q-t更改为^([tT]he\)?[q-tQ-t]+$,如果名称为“the.tally”@JonnyQuest no,则不会匹配。你也可以将第一部分设为所有格,这样如果匹配,它就不会被回溯。找到了我问题的“答案”。如果可以的话,我会在2天内接受我自己的答案。再次感谢!