我想用正则表达式检查这种字符串:
2020_2021_01_01
我把它放在一个变量中,比如$ session
所以我这样做:
if [[ "$session" =~ \d{4}[_]\d{4}[_]\d{2}[_]\d{2} ]]; then
stuff
fi
你知道......它没有用......但我不知道为什么......
任何帮助? 谢谢!
答案 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"正则表达式。