십진수 정규식, 십진수 뒤의 숫자는 선택 사항입니다.


112

숫자를 확인하는 정규식이 필요하지만 소수점 뒤의 숫자는 필요하지 않습니다. 즉.

123
123.
123.4

모두 유효할까요

123..

유효하지 않다

누구라도 대단히 감사하겠습니다!


가장 좋은 답은 여기에 있습니다 : stackoverflow.com/a/39399503/715269
Gangnus

답변:


190

다음을 사용하십시오.

/^\d*\.?\d*$/
  • ^ -줄의 시작;
  • \d* -0 개 이상의 숫자;
  • \.?-선택적 점 (정규식에서는 .특수 문자 이므로 이스케이프 됨 )
  • \d* -0 개 이상의 숫자 (소수점)
  • $ -줄 끝.

이것은 0.5와 같은 선행 0을 요구하는 대신 .5 십진수를 허용합니다.


2
@OrangeDog, 원래는 원하는 것보다 더 많이 일치합니다. 예 : 'cow3.45tornado';)
S. Albano

39
또한 유효한 십진수가 아닌 단일 점과 일치합니다. 더 나은 정규식은 /^\d*\.?\d+$/소수점 뒤에 숫자를 강제하는 것입니다.
Chandranshu 2011

2
@Chandranshu 및 빈 문자열과 일치하며 변경 사항도 해결됩니다.
OGHaza

2
@Chandranshu은 "소수점 이하 숫자가 필요하지 않습니다"
OrangeDog

3
이 솔루션은 작동하지 않습니다. OP는 다음과 같이 명확하게 말합니다.
Alex G

113
/\d+\.?\d*/

하나 이상의 숫자 ( \d+), 선택적 마침표 ( \.?), 0 개 이상의 숫자 ( \d*).

사용 또는 정규식 엔진에 따라 시작 / 끝 줄 앵커를 추가해야 할 수 있습니다.

/^\d+\.?\d*$/

정규식 시각화

Debuggex 데모


12
네,하지만 가장 많이 득표 한 답변은 틀 렸습니다 .. 그리고 빈 문자열 과 모두 일치 합니다.
OrangeDog

1
@Gangnus 또한 ".digit"가 일치해야한다고 말하지 않습니다. 그들이 그것을 원했다면 그들은 말 했어야했다.
OrangeDog

2
@EqualityInTech 나는 그것이 아니라고 확신합니다-전혀 그룹화가 없습니다.
OrangeDog

1
흠 ... 내가 생각했던 것처럼 사악한 정규식을 완전히 이해하지 못할 수도 있다고 생각합니다. 죄송합니다.
JDB는 여전히 Monica를 기억합니다.

1
@AlexanderRyanBaggett 이것은 질문이 지정한 것과 정확히 일치합니다. 보시다시피 전혀 포함되지 않습니다 -.
OrangeDog

74

올바르게 수행하려면 다음과 같은 정규식이 필요합니다.

/^[+-]?((\d+(\.\d*)?)|(\.\d+))$/

확장 된 수정자를 사용하는 공백이있는 동일한 표현식 (Perl에서 지원됨) :

/^  [+-]? ( (\d+ (\.\d*)?)  |  (\.\d+) ) $/x

또는 의견 :

/^           # Beginning of string
 [+-]?       # Optional plus or minus character
 (           # Followed by either:
   (           #   Start of first option
     \d+       #   One or more digits
     (\.\d*)?  #   Optionally followed by: one decimal point and zero or more digits
   )           #   End of first option
   |           # or
   (\.\d+)     #   One decimal point followed by one or more digits
 )           # End of grouping of the OR options
 $           # End of string (i.e. no extra characters remaining)
 /x          # Extended modifier (allows whitespace & comments in regular expression)

예를 들어 다음과 일치합니다.

  • 123
  • 23.45
  • 34.
  • .45
  • -123
  • -273.15
  • -42.
  • -.45
  • +516
  • +9.8
  • +2.
  • +.5

그리고 다음이 아닌 숫자를 거부합니다.

  • . (소수점 하나)
  • -. (마이너스 소수점)
  • +. (소수점 더하기)
  • (빈 문자열)

더 간단한 솔루션은 유효한 숫자를 잘못 거부하거나 이러한 숫자가 아닌 것과 일치시킬 수 있습니다.


1
숫자와 마침표 (42.)와 일치하기 때문에 가장 좋습니다. 그러나 다음과 일치하는 버그 / 거짓 긍정이 있습니다. 3 .... 3 ^ $ 시작 및 끝 문자를 적용하기 위해 두 개의 괄호를 더 추가하여 수정할 수 있습니다. / ^ ([+-]? (\ d + (\ . \ d *)?) | (\. \ d +)) $ /
Pete Alvin

1
감사합니다 Pete, 잘 발견되었습니다. 이제 의도 한대로 작동하도록 괄호를 추가하여 대답이 수정되었습니다. 이제 다음과 같이 작성되었습니다 ^A?(B|C)$. 이전에는 ^A?B|C$실제로 (^A?B)|(C$)잘못된 것을 의미 하는 것처럼 작성 되었습니다. 참고 : ^(A?B|C)$실제로 ^((A?B)|(C))$"+.5"와 일치하지 않음을 의미하기 때문에 또한 올바르지 않습니다 .
Hoylen 2014 년

2
이것이 최고의 답변입니다. 다른 답변은 모든 경우를 처리하지 않습니다. 누락 된 숫자 사례를 처리하기 위해 미리보기를 사용하는 것을 제외하고는 비슷한 작업을 수행합니다. /^[+-]?(?=\d|\.\d)\d*(\.\d*)?$ /
PhilHarvey 2015

1
이것이 유일한 올바른 정규식입니다. 그러나 어떤 사람들은 "34"에 동의하지 않을 것입니다. 대신 I *의 초 후에 D + 제안 것
Gangnus

1
이것은 또한 0000.2와 일치하는데, 이는 아마도 원하는 것이 아닐 것입니다.
아론 Zorel

11

이 정규식을 시도하십시오.

\d+\.?\d*

\ d + 숫자 (선택적 십진수 앞자리)
.? 선택적 소수 (? 한정자로 인해 선택적)
\ d * 소수 이후 선택적 숫자


1
아니요, 일치하지 않습니다123.
Bart Kiers 2012-08-24

1
메모 감사합니다. 내 정규식을 수정했습니다.
Kash

4
사실,하지만 이제는 이미 다른 사람이 게시 한 내용으로 편집했습니다. 또 다른 "정답"을 제거하는 것을 고려하십시오.
Bart Kiers 2012-08-24

10

모든 요구 사항과 일치하기 때문에 이것이 최선이라고 생각합니다.

^\d+(\\.\d+)?$

1
저에게는 이것이 가장 좋은 대답입니다. 문자열 : "4"이기 때문입니다. (예를 들어) 최소한 루비 언어에서는 유효한 숫자가 아닙니다. 그러나 가장 많이 찬성 된 답변은 "4"를 받아들입니다. 숫자 정규식으로 잘못되었습니다.
Victor


3

이것을 사용할 수 있습니다.

^\d+(\.\d)?\d*$

일치 :
11
11.1
0.2

일치하지 않음 :
.2
2.
2.6.9


아주 간단한 감사와 일치 내가 필요
HANY


2

이것이 내가 한 일입니다. 위의 어느 것보다 더 엄격하고 일부보다 더 정확합니다.

^0$|^[1-9]\d*$|^\.\d+$|^0\.\d*$|^[1-9]\d*\.\d*$

통과하는 문자열 :

0
0.
1
123
123.
123.4
.0
.0123
.123
0.123
1.234
12.34

실패한 문자열 :

.
00000
01
.0.
..
00.123
02.134

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

사람들이 일반적으로 잘 구성된 십진수로 생각하는 것을 반영해야합니다.

소수점 앞의 자릿수는 단일 자릿수 일 수 있으며,이 경우 0에서 9까지 일 수 있으며 두 자릿 이상일 수 있으며이 경우 0으로 시작할 수 없습니다.

소수점 앞에 숫자가 있으면 소수점과 그 뒤에 오는 숫자는 선택 사항입니다. 그렇지 않으면 소수가 있어야하며 그 뒤에 최소 한 자리가 와야합니다. 소수점 뒤에 여러 개의 후행 0이 허용됩니다.

grep -E '^[+-]?(([1-9][0-9]*)?[0-9](\.[0-9]*)?|\.[0-9]+)$'

다음과 올바르게 일치합니다.

9
0
10
10.
0.
0.0
0.100
0.10
0.01
10.0
10.10
.0
.1
.00
.100
.001

서명 된 등가물뿐만 아니라 다음을 거부합니다.

.
00
01
00.0
01.3

및 서명 된 등가물과 빈 문자열.


1
(?<![^d])\d+(?:\.\d+)?(?![^d])

깨끗하고 간단합니다.

접미사 및 접두사, RegEx 기능을 사용합니다.

IsMatch 조건에 대해 true-false를 직접 반환합니다.


1
^\d+(()|(\.\d+)?)$

이것으로 나왔습니다. 정수와 소수를 모두 허용하지만 소수를 입력하기로 결정한 경우 완전한 소수 (선행 및 후행 숫자)를 적용합니다.


1

요청한 내용은 이미 답변되어 있으므로 선택적 소수점을 입력하면 소수점 2 자리 만 원하는 사용자를위한 추가 정보 일뿐입니다.

^\d+(\.\d{2})?$

^ : 문자열 시작
\ d : 숫자 ([0-9]와 같음)
+ : 1 회 무제한

그룹 (. \ d {2})을 캡처 하시겠습니까?
? : 0 번과 1 번. : 캐릭터 .
\ d : 숫자 ([0-9]와 같음)
{2} : 정확히 2 배
$ : 문자열의 끝

1 : 일치
123 : 일치
123.00 : 일치
123. : 일치하지 않음
123 .. : 일치하지 않음
123.0 : 일치
하지 않음
123.000 : 일치하지 않음 123.00.00 : 일치하지 않음


음수와 일치합니까?
Alexander Ryan Baggett

1
당신이 부정적인 기호를 확인하기 위해 필요 @AlexanderRyanBaggett이 될 수 있도록 :? ^ - \ D + (. \ \ D {2}) $
PersyJack

0

Perl에서 Regexp :: Common을 사용하면 특정 숫자 형식에 대해 미세 조정 된 정규 표현식을 조합 할 수 있습니다. Perl을 사용하지 않는 경우 생성 된 정규식은 일반적으로 다른 언어에서 계속 사용할 수 있습니다.

Regexp :: Common :: Number에서 예제 정규식 생성 결과를 인쇄합니다.

$ perl -MRegexp::Common=number -E 'say $RE{num}{int}'
(?:(?:[-+]?)(?:[0123456789]+))

$ perl -MRegexp::Common=number -E 'say $RE{num}{real}'
(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789])(?:[0123456789]*)(?:(?:[.])(?:[0123456789]{0,}))?)(?:(?:[E])(?:(?:[-+]?)(?:[0123456789]+))|))

$ perl -MRegexp::Common=number -E 'say $RE{num}{real}{-base=>16}'
(?:(?i)(?:[-+]?)(?:(?=[.]?[0123456789ABCDEF])(?:[0123456789ABCDEF]*)(?:(?:[.])(?:[0123456789ABCDEF]{0,}))?)(?:(?:[G])(?:(?:[-+]?)(?:[0123456789ABCDEF]+))|))

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.