Regex 使用正则表达式只匹配十进制数字,但我一直匹配非单位数数字

Regex 使用正则表达式只匹配十进制数字,但我一直匹配非单位数数字,regex,bash,if-statement,Regex,Bash,If Statement,我试图在变量“check_dec”中存储一个正则表达式,以验证用户的输入。 我很难理解为什么我输入的任何非单位数值都会进入“if”语句并读取“该值是十进制的” 例如,当我键入(44、100、1000等)时,输出为“值为十进制” 但是,当我输入一位数字时,输出显示“值为整数” 我对regex/bash是全新的,不完全理解。 任何帮助都将不胜感激。您需要通过以下方式逃离\: check_dec=^[0-9]*\.+[0-9]+ input=0 echo "Please e

我试图在变量“check_dec”中存储一个正则表达式,以验证用户的输入。 我很难理解为什么我输入的任何非单位数值都会进入“if”语句并读取“该值是十进制的”

例如,当我键入(44、100、1000等)时,输出为“值为十进制” 但是,当我输入一位数字时,输出显示“值为整数”

我对regex/bash是全新的,不完全理解。
任何帮助都将不胜感激。

您需要通过以下方式逃离
\

  check_dec=^[0-9]*\.+[0-9]+
  input=0
  
  echo "Please enter a digit: "
  read input
 
  if [[ $input =~ $check_dec ]]
  then
           echo "The value is a decimal"
  else
          echo "The value is an integer"
  fi
或通过:

check_dec=^[0-9]*\\.+[0-9]+
原因是
\
字符在bash中有特殊含义:

check_dec='^[0-9]*\.+[0-9]+'
$echo^[0-9]*\.+[0-9]+

^[0-9]*.+[0-9]+设置正则表达式有几个问题,一个现在咬你,另一个以后可能咬你。你做了一个

$ echo ^[0-9]*\.+[0-9]+
^[0-9]*.+[0-9]+               <---- note: missing \
$ echo ^[0-9]*\\.+[0-9]+
^[0-9]*\.+[0-9]+
$ echo '^[0-9]*\.+[0-9]+'
^[0-9]*\.+[0-9]+
如果你做了一个

check_dec=^[0-9]*\.+[0-9]+
之后,您会看到
check\u dec
包含字符串^[0-9]*.+[0-9]+而不是^[0-9]*.+[0-9]+。。。。原因是bash将
\
解释为(不必要的)转义以下字符的尝试

bash还尝试将
*
[…]
解释为bash通配符以进行扩展。如果您的工作目录中碰巧有一个名为
^7xxx.+8+
的文件,
check\u dec
将包含此文件名,而不是您精心编制的模式

您需要引用regexp以确保bash不让手指接触它:

echo $check_dec 
奇怪的是,你似乎允许超过一个小数点。例如,根据您的模式,字符串
…22
将限定为十进制,而字符串
foo\u bar
将是整数。

您的正则表达式:

check_dec='^[0-9]*[.]+[0-9]+'
有两个主要问题:

  • 因此,不引用有效地使其成为
    “=^[0-9].+[0-9]+”
    。请注意,在正则表达式中,点匹配任何字符,因此此(不正确)正则表达式表示:
    • 匹配0个或多个数字,即
      [0-9]*
    • 匹配任意字符的1+,即
      +
    • 匹配1+个数字
      [0-9]+
    很明显,这个正则表达式需要输入至少2个字符,并且应该以数字结尾

  • 从前面的评论中可以明显看出,除了引用问题正则表达式本身之外,这是不正确的
  • 要使正则表达式与十进制数匹配,如
    123.45
    ,正确的正则表达式应为:

    check_dec=^[0-9]*\.+[0-9]+
    

    请注意,点后没有量词
    +
    ,只允许数字中有一个点和引号。

    您的正则表达式看起来不错。。=~运算符
    +
    意味着前面的字符必须至少出现一次。如果正则表达式中没有尾随的
    $
    ,也可以使用
    1a
    。请参阅:感谢Prakhar/Cyrus的回复…@PrakharLondhe,据我所知,“=~”表示运算符左侧的符号将与右侧的正则表达式匹配。感谢您的评论anubhava,我发现它非常有用!除了理解我是在匹配文字“.”并查找任何字符之外,我还发现通过匹配“\.+”我将允许匹配像“…4”这样的字符,这是不必要的。再次感谢您的回复。感谢您的回复,我使用了反斜杠,它按照我预期的方式工作!感谢您的详细回复,我现在可以肯定地看到单引号的重要性。我理解为什么“……22”会匹配(b/c我当前的正则表达式与一个或多个[]匹配),但我很难理解为什么字符串foo_bar会变成整数。我不想输入字符串,但正如您所说,字符串似乎以整数形式返回。您只有两种选择:十进制和整数。由于“foo_bar”与十进制模式不匹配,因此控制流将以整数分支结束。就好像你要给你的客人提供葡萄酒或啤酒,然后你问他:你想要葡萄酒吗?如果他答应,你就给他酒,否则你就给他啤酒。如果他不说“是”(因为他是穆斯林),你最终会给他啤酒。。。。。
    check_dec='^[0-9]*\.[0-9]+'