我使用正则表达式来匹配浮点数:
for f in $float_numbers ; do
if [ $f =~ "[0-9]*\.?[0-9]*" ] ; then
echo "****f is $f ****"
fi
done
其中$float_numbers
包含浮点数,如1.2
、10.5
、4.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 的边缘情况.
(应该不是成为一场比赛)。