浮動小数点数と一致させるために正規表現を使用しています。
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]*
すべての数量子(*
、、?
)は、式のすべての部分がオプションであることを示します。つまり、正規表現は、空の文字列と数字のない文字列を含むすべての文字列と一致します。
浮動小数点数を一致させるには、少なくとも1つの数字が一致する必要があります。
([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
これを使用することをお勧めしますtxt2reregex
希望の試合を作成してください。
あなたのためのスクリプト:
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
したがって、上記の正規表現はこのような場合だけでなく、単なる.
極端な場合も処理します。いいえ競争になる)。