shell脚本中匹配浮点数的正则表达式

shell脚本中匹配浮点数的正则表达式

我使用正则表达式来匹配浮点数:

for f in $float_numbers ; do
    if [ $f =~ "[0-9]*\.?[0-9]*" ] ; then
        echo "****f is $f ****"
    fi
done

其中$float_numbers包含浮点数,如1.210.54.0等。

但没有任何匹配。

答案1

terdon 已更正您的语法,但您的正则表达式是错误的:

[0-9]*\.?[0-9]*

所有量词 ( *, ?) 表示表达式的所有部分都是可选的。这意味着您的正则表达式将匹配每个字符串,包括空字符串和没有数字的字符串。

要匹配浮点数,您需要匹配至少一位数字。

([0-9]+\.?[0-9]*)|([0-9]*\.[0-9]+)

它匹配一些带有可选小数点和可选数字的数字(例如:3.14 或 42),或一些可选数字,但需要小数点和必需数字(例如:.1234 或 3.14)。

它没有锚定,因此字符串“PI 以 3.14 开头并继续”将匹配。

测试:

for n in "" "no digits" 42 3.14 "this is .1234 go"; do 
    if [[ $n =~ ([0-9]+\.?[0-9]*)|([0-9]*\.[0-9]+) ]]; then
        echo "yes -- $n -- ${BASH_REMATCH[0]}"
    fi
done
yes -- 42 -- 42
yes -- 3.14 -- 3.14
yes -- this is .1234 go -- .1234

答案2

首先,您的代码有语法错误,应该抱怨:

bash: [: =~: binary operator expected

假设您正在运行 bash,但根据您的代码,您可能正在运行。所以,在 bash 中,=~只有 里面起作用[[ ]],而不是[ ].您也不应该引用正则表达式。你正在寻找这样的东西:

$ for f in $float_numbers; do 
    [[ $f =~ [0-9]*\.?[0-9]* ]] && echo $f
  done
1.2
10.5
4.0

然而,格伦非常正确指出,你的正则表达式首先是错误的。

答案3

我建议你使用这个txt2re构建regex您想要的匹配项。

给你的脚本:

for f in $float_numbers ; do
    if [[ $f =~ ^[+-]?[0-9]+\.?[0-9]*$ ]]; then
        echo "****f is $f ****"
    fi
done

重新解释:

^       # Match start of string
[-+]?   # Match a leading + or - (optional)
[0-9]+  # Match one or more digit
\.?     # Match a literal . (optional, escaped)
[0-9]*  # Match zero or more digits
$       # Match the end of the string

这是perl由前一个站点生成的与浮点数匹配的脚本

#!/usr/bin/perl

# URL that generated this code:
# http://txt2re.com/index.php3?s=100.3&1

$txt='100.3';

$re1='([+-]?\\d*\\.\\d+)';  # Float 1

$re=$re1;
if ($txt =~ m/$re/is)
{
    $float1=$1;
    print "($float1) \n";
}

#-----
# Paste the code into a new perl file. Then in Unix:
# $ perl x.pl 
#-----

答案4

匹配浮点数的更精确的正则表达式是:

^[-+]?([0-9]*\.[0-9]+|[0-9]+\.[0-9]*)$

这取决于您对浮动的看法。例如,Python 接受5..5作为有效浮点数,并且不需要在 之前或之后有前导或尾随数字.

>>> 5.
5.0
>>> .5
0.5

所以上面的正则表达式处理这些情况,以及 just 的边缘情况.(应该不是成为一场比赛)。

相关内容