Bash regex匹配冒号分隔的整数

Bash regex匹配冒号分隔的整数,regex,bash,Regex,Bash,我正在尝试解析一个字幕文件。示例字符串如下所示: 00:00:01000-->00:00:04074 我有一个正则表达式: #!/bin/bash while read line do if [[ "$line" =~ ^[0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}* ]] then echo $line fi done < $1 然后它就不工作了 同样,此正则表达式也适用于: w

我正在尝试解析一个字幕文件。示例字符串如下所示:

00:00:01000-->00:00:04074

我有一个正则表达式:

#!/bin/bash
while read line
do      
    if [[ "$line" =~ ^[0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}* ]]
    then
            echo $line
    fi           
done < $1
然后它就不工作了

同样,此正则表达式也适用于:

while read line
do
       if [[ "$line" =~ [0-9]{2}*[0-9]{2}*[0-9]{2}*[0-9]{3}*--\>*[0-9]{2}*[0-9]{2}*[0-9]{2}*[0-9]{3}* ]]
        then
                echo $line
        fi

done < $1
读取行时
做
如果[[“$line”=~[0-9]{2}*[0-9]{2}*[0-9]{2}*[0-9]{3}*-\>*[0-9]{2}*[0-9]{2}*[0-9]{2}*[0-9]{3}*]
然后
回音$线
fi
已完成<$1
但是,如果我将
^
放在模式的开头(如第一种情况),或者如果我使用
s和
s,它将不再工作


我不明白它为什么表现出如此奇怪的行为。有人能帮忙吗?

*
的工作原理与命令行中的文件匹配不同。它的意思是“前一个字符的0个或多个”,而不是“任何字符的0个或多个”。您需要在其前面加上
,使其匹配任何字符的0个或多个(因为
是正则表达式中匹配任何字符的特殊字符)

这将与您的产品线相匹配,并且可能是您最终想要的正则表达式:

if [[ "$line" =~ ^[0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}\ ?--\>\ ?[0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}$ ]];

*
的工作原理与命令行中的文件匹配不同。它的意思是“前一个字符的0个或多个”,而不是“任何字符的0个或多个”。您需要在其前面加上
,使其匹配任何字符的0个或多个(因为
是正则表达式中匹配任何字符的特殊字符)

这将与您的产品线相匹配,并且可能是您最终想要的正则表达式:

if [[ "$line" =~ ^[0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}\ ?--\>\ ?[0-9]{2}:[0-9]{2}:[0-9]{2},[0-9]{3}$ ]];

谢谢你能告诉我为什么结尾处有$吗?正如开头的
^
表示“仅在字符串开头匹配”,而
$
仅在字符串结尾匹配。因此,如果同时使用它们,则正则表达式必须匹配整个字符串。方括号外的连字符并不特殊,也不需要转义。@DennisWilliamson您完全正确。我已经更正了我的答案。(为了清楚起见,我还是想避开他们。但是,是的,完全没有必要。)谢谢!你能告诉我为什么结尾处有$吗?正如开头的
^
表示“仅在字符串开头匹配”,而
$
仅在字符串结尾匹配。因此,如果同时使用它们,则正则表达式必须匹配整个字符串。方括号外的连字符并不特殊,也不需要转义。@DennisWilliamson您完全正确。我已经更正了我的答案。(为了清楚起见,我还是倾向于避开它们。但是,是的,完全没有必要。)