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

Regex 正则表达式不匹配。在线发电机,regex,bash,if-statement,Regex,Bash,If Statement,我想用正则表达式检查这种字符串: 2020\u 2021\u 01\u 01 我把它放在一个变量中,比如$session 因此,我: if [[ "$session" =~ \d{4}[_]\d{4}[_]\d{2}[_]\d{2} ]]; then stuff fi 你看…它不起作用。。。但我不知道为什么 有什么帮助吗? 谢谢 反斜杠字符是bash shell中的转义字符。在您的示例中,我认为这使得正则表达式如下所示: d{4}[_]d{4}[_]d{2}[_]d{2} 您可以

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

2020\u 2021\u 01\u 01

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

因此,我:

if  [[  "$session" =~ \d{4}[_]\d{4}[_]\d{2}[_]\d{2} ]]; then
    stuff
fi
你看…它不起作用。。。但我不知道为什么

有什么帮助吗?
谢谢

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

d{4}[_]d{4}[_]d{2}[_]d{2}
您可以通过测试来确认这一点,将$session设置为dddd\u dddd\u dd\u dd

要解决此问题,要在正则表达式中保留反斜杠字符,需要对其进行转义。在您的情况下,在每个反斜杠前面加上一个额外的反斜杠就可以了。shell将看到两个反斜杠,并将第二个反斜杠保留为字符串的一部分

if  [[  "$session" =~ \\d{4}[_]\\d{4}[_]\\d{2}[_]\\d{2} ]]; then
我不确定是否还有其他字符需要转义。这需要一个真正的短脚本,一个你可以修改并运行的脚本,来找出哪些工作正常,哪些不正常。你能匹配字符串的开头、一位数字字符等吗

整个逃跑的过程变得更加有趣。。。内双引号,内单引号


我曾经使用过一个网站,输入了我想要的字符串,它会给我返回shell脚本中所需的外观,我再也没有链接了。可能有一个正则表达式测试程序可以让您测试bash正则表达式。

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

d{4}[_]d{4}[_]d{2}[_]d{2}
您可以通过测试来确认这一点,将$session设置为dddd\u dddd\u dd\u dd

要解决此问题,要在正则表达式中保留反斜杠字符,需要对其进行转义。在您的情况下,在每个反斜杠前面加上一个额外的反斜杠就可以了。shell将看到两个反斜杠,并将第二个反斜杠保留为字符串的一部分

if  [[  "$session" =~ \\d{4}[_]\\d{4}[_]\\d{2}[_]\\d{2} ]]; then
我不确定是否还有其他字符需要转义。这需要一个真正的短脚本,一个你可以修改并运行的脚本,来找出哪些工作正常,哪些不正常。你能匹配字符串的开头、一位数字字符等吗

整个逃跑的过程变得更加有趣。。。内双引号,内单引号

我曾经使用过一个网站,输入了我想要的字符串,它会给我返回shell脚本中所需的外观,我再也没有链接了。可能有一个正则表达式测试器可以让您测试bash正则表达式。

该测试器非常简洁地解释了当使用=~运算符时,运算符右侧的字符串被视为扩展正则表达式,并相应地匹配,如regex3所示

这里,regex3是对man3regex的引用,这可以解释什么是扩展正则表达式。较长的描述是Posix标准扩展正则表达式,您可以在中找到这些表达式的文档。如果您使用的是在线正则表达式测试仪,请确保选择Posix正则表达式

简而言之,它们不包括像\d这样的perlism。您可以编写[[:digit:]或使用C语言环境[0-9]

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

([[:digit:]]{4}_){2}[[:digit:]]{2}_[[:digit:]]{2}
没有必要引用。但是,请注意,=~运算符查找与模式匹配的子字符串,而不是测试左侧运算符是否与模式精确匹配。所以你很可能真的想要一场锚定比赛:

^([[:digit:]]{4}_){2}[[:digit:]]{2}_[[:digit:]]{2}$
更简洁的解释是,当使用=~运算符时,运算符右侧的字符串被视为扩展正则表达式,并相应地匹配,如regex3所示

这里,regex3是对man3regex的引用,这可以解释什么是扩展正则表达式。较长的描述是Posix标准扩展正则表达式,您可以在中找到这些表达式的文档。如果您使用的是在线正则表达式测试仪,请确保选择Posix正则表达式

简而言之,它们不包括像\d这样的perlism。您可以编写[[:digit:]或使用C语言环境[0-9]

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

([[:digit:]]{4}_){2}[[:digit:]]{2}_[[:digit:]]{2}
没有必要引用。但是,请注意,=~运算符查找与模式匹配的子字符串,而不是测试左侧运算符是否与模式精确匹配。所以你很可能真的想要一场锚定比赛:

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

当您说“online generator有”时,这是否意味着您已经在regexp的web应用程序上尝试过它?你能提供一个链接吗?还有,输出是什么?它与您期望的有什么不同?当您说“online generator does”时,这是否意味着您已经在regexp的web应用程序上尝试过它?你能提供一个链接吗?还有,输出是什么?它与您期望的有何不同?实际上,\d在posix正则表达式中不起作用。但你是对的,如果它真的起作用,它就不需要了
o可以使用额外的转义符编写,因为bash不允许引用正则表达式运算符。引用的字符是自匹配的,不管它们是什么。实际上,\d在posix正则表达式中不起作用。但是你是对的,如果它真的起作用,那么它就需要用一个额外的转义符来编写,因为bash不允许你引用regex操作符。引用的字符是自匹配的,不管它们是什么。