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

时间:2014-09-29 01:26:22

标签: regex bash if-statement

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

2020_2021_01_01

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

所以我这样做:

if  [[  "$session" =~ \d{4}[_]\d{4}[_]\d{2}[_]\d{2} ]]; then
    stuff
fi
你知道......它没有用......但我不知道为什么......

任何帮助? 谢谢!

2 个答案:

答案 0 :(得分:5)

bash manual相当简洁地解释了当使用=~运算符"时,运算符右侧的字符串被视为扩展正则表达式并相应匹配(如正则表达式中所示) 3))"

此处,regex(3)是对man 3 regex的引用,可能会解释"扩展的正则表达式"是。更长的描述是" Posix标准扩展正则表达式",您可以找到Posix document中的文档。如果您正在使用在线正则表达式测试器,请确保选择" Posix正则表达式"。

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

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

([[:digit:]]{4}_){2}[[:digit:]]{2}_[[:digit:]]{2}

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

^([[:digit:]]{4}_){2}[[:digit:]]{2}_[[:digit:]]{2}$

答案 1 :(得分:0)

反斜杠字符是bash shell中的转义字符。在您的示例中,我认为正则表达式如下所示:

d{4}[_]d{4}[_]d{2}[_]d{2}

您可以通过测试确认这一点,将$ session设置为dddd_dddd_dd_dd

要解决此问题,要保留正则表达式中的反斜杠字符,您需要"转义"它。在你的情况下,在每个反斜杠之前加上" extra"反斜杠可能会成功。 shell将看到两个反斜杠,并留下第二个反斜杠,作为字符串的一部分。

if  [[  "$session" =~ \\d{4}[_]\\d{4}[_]\\d{2}[_]\\d{2} ]]; then

我不确定是否还有其他角色需要转义。这需要一个真正的短脚本,一个你可以改变和运行的脚本,以找出什么是工作,什么不是。你能匹配字符串的开头,单个数字字符等吗?

(整个逃避的东西变得更加有趣......在双引号内,单引号内,......)

我曾经使用过一个网站,放入我想要的字符串,它会让我回到shell脚本中需要的内容,我不再有这个链接了。可能是正则表达式测试程序,让您测试" bash"正则表达式。