正则表达式不匹配.在线发电机

use*_*732 1 regex bash if-statement

我想用正则表达式检查这种字符串:

2020_2021_01_01

我把它放在一个变量中,比如$ session

我这样做:

if  [[  "$session" =~ \d{4}[_]\d{4}[_]\d{2}[_]\d{2} ]]; then
    stuff
fi
Run Code Online (Sandbox Code Playgroud)

你看......它不起作用......但我不知道为什么......

任何帮助?谢谢!

ric*_*ici 5

所述的bash手册而简洁地解释说,当=~操作者"时,该字符串给操作者的右侧被认为是一个扩展正则表达式,并相应地匹配(如在正则表达式(3))".

这里regex(3)是一个引用man 3 regex,可以解释"扩展正则表达式"是什么.更长的描述是"Posix标准扩展正则表达式",您可以在Posix文档中找到这些文档.如果您使用的是在线正则表达式测试程序,请确保选择"Posix正则表达式".

简而言之,它们不包括像Perlisms \d.您可以编写[[:digit:]]或(如果您使用的是C语言环境)[0-9].

所以你的正则表达式可以写成:

([[:digit:]]{4}_){2}[[:digit:]]{2}_[[:digit:]]{2}
Run Code Online (Sandbox Code Playgroud)

(没有必要引用_).但是,请注意=~操作符要查找与模式匹配的子字符串,而不是测试左侧操作符是否与模式完全匹配.所以你很可能真的想要一个锚定的匹配:

^([[:digit:]]{4}_){2}[[:digit:]]{2}_[[:digit:]]{2}$
Run Code Online (Sandbox Code Playgroud)