쉘 스크립트의 부동 소수점 숫자와 일치하는 정규식

쉘 스크립트의 부동 소수점 숫자와 일치하는 정규식

부동 소수점 숫자와 일치시키기 위해 정규식을 사용하고 있습니다.

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

, 등 $float_numbers의 부동 소수점 숫자를 포함 합니다 1.2.10.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

이것을 사용하는 것이 좋습니다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

따라서 위의 정규식은 이러한 경우뿐만 아니라 단지 .(should) 의 극단적인 경우도 처리합니다.아니요경쟁이 된다).

관련 정보