Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex Bash脚本,if语句中的正则表达式_Regex_Bash - Fatal编程技术网

Regex Bash脚本,if语句中的正则表达式

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]

我对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]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天内接受我自己的答案。再次感谢!