숫자 만 정규식


309

정규 표현식을 전혀 사용하지 않았으므로 문제 해결에 어려움이 있습니다. 포함 된 문자열이 모든 숫자 일 때만 정규 표현식이 일치하도록하고 싶습니다. 그러나 아래 두 가지 예에서는 모든 숫자와 "1234 = 4321"과 같은 등호를 포함하는 문자열과 일치합니다. 나는이 행동을 바꿀 수있는 방법이 있다고 확신하지만, 내가 말했듯이 정규 표현식으로 많은 것을 한 적이 없습니다.

string compare = "1234=4321";
Regex regex = new Regex(@"[\d]");

if (regex.IsMatch(compare))
{ 
    //true
}

regex = new Regex("[0-9]");

if (regex.IsMatch(compare))
{ 
    //true
}

중요한 경우 C # 및 .NET2.0을 사용하고 있습니다.


6
숫자숫자 를 일치시켜야 합니까? 예를 들어 : 123.456은 숫자이지만 모든 숫자가 아닙니다.
Joel Coehoorn

정확히, OP는 정수 사용에 대해 명확하지 않습니다
Sune Rievers

3
왜 간단한 경우에 대한 문자열을 구문 분석하지 않습니까? bool decimal.TryParse (문자열 문자열, 10 진수 결과) 또는 bool int.TryParse (문자열 문자열, 정수 int 결과)
Makach

정규식으로 숫자를 구문 분석하는 결정적인 처리 방법에 대해서는 이 답변 을 보십시오 .
tchrist

1
일반적으로 Regex 표현식의 문제를 해결하는 가장 쉬운 방법은 귀하의 언어가 허용하는 경우 명령 줄 인터프리터를 사용하는 것입니다 (대부분의 경우). 이 예제는 C #에 있기 때문에 linqpad.net 을 사용 하거나 디버거에서 중단 점을 사용한 다음 VS의 직접 실행 창을 CLI로 사용할 수 있습니다.
앤드류

답변:


478

시작 및 끝 앵커를 사용하십시오.

Regex regex = new Regex(@"^\d$");

"^\d+$"두 자리 이상 일치해야하는 경우 사용하십시오 .


참고 "\d"일치 [0-9]와 동부 아라비아 숫자와 같은 다른 숫자 문자 ٠١٢٣٤٥٦٧٨٩. "^[0-9]+$"일치를 아라비아 숫자 0-9로 제한하는 데 사용하십시오 .


숫자 이외의 숫자 표현을 포함해야하는 경우 (예 : 10 진수 값과 같은) 정규 표현식으로 숫자를 구문 분석하는 @tchrist포괄적 인 안내서를 참조하십시오 .


설정된 숫자 값은 어떻습니까? 이것은 일반적으로 인도와 같은 특정 국가의 우편 번호에 해당됩니다. 이 후에 문자열 길이를 확인해야 할 수도 있습니다.
Najeeb

2
@Najeeb 예, 인도 우편 번호는 6 자리 숫자이므로 다음과 같은 것을 사용할 수 있습니다 "^\d{6}$". 다른 국가에서는 우편 번호 규칙이 더 복잡하므로 여러 국가의 정규식 솔루션도 매우 복잡 할 수 있습니다. stackoverflow.com/q/578406/1288
Bill the Lizard

입력 문자열이 "3 a"와 같은 경우 어떻게됩니까? 여전히 일치합니까? 누구든지 숫자가있는 경우에만 일치시킬 수있는 방법을 알고 있습니까 (음수 부호 제외). 현재 "-? [0-9] +"와 같이 설정되어 있습니다.
Matthew

105

정규식은 숫자가 포함 된 것과 일치하며 앵커를 사용하여 전체 문자열을 일치시킨 다음 하나 이상의 숫자를 일치시킵니다.

regex = new Regex("^[0-9]+$");

(가) ^하여 문자열의 시작을 고정합니다, (가) $문자열의 끝을 고정 것이며,이 +하나를 일치 이상 (이 경우의 수)를 앞에 무슨.


38

소수점과 천 개의 마커를 견뎌야하는 경우

var regex = new Regex(@"^-?[0-9][0-9,\.]+$");

숫자가 음수가 될 수 있으면 "-"가 필요합니다.


@ 플로린 지타. 감사. "-"는 시작에 있어야합니다.
Andy

3
이 정규식은 선행 음수 부호 ( -)와 마침표 ( .)가 두 번 이상 발생하는 것을 잘못 허용합니다 .
DavidRR

5
를 통해 만들 -거나 .옵션으로 할 수 있습니다 ?. -?\d+(?:\.\d+)?정수 또는 소수와 일치합니다. (는 ?:괄호에 바로 괄호 비 캡처 그룹과 선명도 만 그룹에 사용한다.)
butterywombat

2
1, .5와 같은 엣지 케이스에서는 실패하지만 그것을 감독하면 실패합니다. 여전히 -2와 같은 기본 경우에는 실패합니다. ^-?[0-9][0-9,\.]*$기본 사례에 실패하지 않도록 변경하십시오 . +는 *로 대체되었습니다
PrivateOmega

여기서 누락 된 시나리오는 엔지니어링 표기법 (1.2345e-4)에 대한 제안입니까?
WolfiG

18

전체 문자열과 일치하지 않는 "일치"를 찾기 때문에 일치합니다. 문자열의 시작과 끝을 구체적으로 찾도록 regexp를 변경하여이 문제를 해결할 수 있습니다.

^\d+$

16

아마도 내 방법이 도움이 될 것입니다.

    public static bool IsNumber(string s)
    {
        return s.All(char.IsDigit);
    }

3
그러나 UnicodeCategory.DecimalDigitNumber 범주 의 멤버 인 모든 문자 를 Char.IsDigit반환 한다는 점에 유의하십시오 . OP가 원하는 것이 아닐 수도 있습니다. int로 구문 분석 할 수없는 문자에 대해 Char.IsDigit이 true를 반환하는 이유를 참조하십시오 . . true
DavidRR


16

이것은 정수와 10 진수로 작동합니다. 숫자에 코마 천 구분 기호가 있으면 일치하지 않습니다.

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

이것과 일치하는 일부 문자열 :

894
923.21
76876876
.32
-894
-923.21
-76876876
-.32

그렇지 않은 문자열 :

hello
9bye
hello9bye
888,323
5,434.3
-8,336.09
87078.


10

모든 숫자가 숫자 (0-9)인지 확인해야하는 경우

^[0-9]+$

1425 참

0142 참

0 참

1 참

154a25 거짓

1234 = 3254 거짓


10

다음은 작동하는 것입니다.

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

그리고 일부 테스트

긍정적 인 테스트 :

string []goodNumbers={"3","-3","0","0.0","1.0","0.1","0.0001","-555","94549870965"};

부정적인 테스트 :

string []badNums={"a",""," ","-","001","-00.2","000.5",".3","3."," -1","--1","-.1","-0"};

C #뿐만 아니라 Java, Javascript 및 PHP에서도 확인


".3", "3." 실제로 좋은 숫자입니다 (각각 0.3과 3.0을 의미). 우리는 이것을 소스 시스템에서 항상보고 있으며, 언급 한 언어의 대부분의 to_number (xx) 함수는이를 올바르게 인식하고 수렴 할 것입니다. 감사.
Tagar

1
@Ruslan 당신은 많은 시스템에서 ".3", "3." 유효한 숫자로 구문 분석하고 "0.3"및 "3.0"을 언급 한대로 사용합니다. 그러나 다른 한편으로는-그것은 가치 가 변환됩니다. 원래 값 ".3"과 "3"입니다. 실제로 존재하는 숫자가 아닙니다.
Marina K.

9

못생긴 형식으로 죄송합니다. 자릿수 :

[0-9]*

하나 이상의 숫자의 경우 :

[0-9]+

7

위의 해결책 중 어느 것도 내 목적에 맞지 않았지만 이것은 나를 위해 일했습니다.

var pattern = @"^(-?[1-9]+\d*([.]\d+)?)$|^(-?0[.]\d*[1-9]+)$|^0$|^0.0$";
return Regex.Match(value, pattern, RegexOptions.IgnoreCase).Success;

유효한 값의 예 : "3", "-3", "0", "0.0", "1.0", "0.7", "690.7", "0.0001", "-555", "945465464654"

유효하지 않은 값의 예 : "a", "", "", ".", "-", "001", "00.2", "000.5", ".3", "3.", "-1" , "--1", "-.1", "-0", "00099", "099"


4

다른 방법 : 페르시아어 또는 아랍어와 같은 국제 번호를 일치 시키려면 다음 표현을 사용할 수 있습니다.

Regex = new Regex(@"^[\p{N}]+$");

리터럴 마침표 문자를 사용하려면 다음을 사용하십시오.

Regex = new Regex(@"^[\p{N}\.]+$");

4

시작 및 끝 앵커를 사용하십시오.

 Regex regex = new Regex(@"^\d$");
 Use "^\d+$" if you need to match more than one digit.

3

정수 및 부동 소수점 숫자에 대한 정규식 :

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

숫자는 마침표 (앞자리)없이 시작할 수 있으며 마침표 (마침 자리)없이 끝날 수 있습니다. 위의 정규 표현식은 둘 다 올바른 숫자로 인식합니다.

ㅏ . 숫자가없는 (마침표) 자체는 올바른 숫자가 아닙니다. 그렇기 때문에 두 개의 정규식 부분이 필요합니다 ( "|"로 구분).

도움이 되었기를 바랍니다.


1
이것이 가장 완벽한 솔루션입니다. 축하합니다!
Renato Medeiros

2

나는 이것이 가장 간단한 것으로 생각하고 유럽과 미국의 숫자를 쓰는 방식을 받아들입니다. 이 숫자 외에도 .55 또는, 55가 통과합니다. 이것은 편리 할 수 ​​있습니다.

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


-4

정규식 정규식 = 새 정규식 ( "^ [0-9] {1,4} = [0-9] {1,4] $")


5
답을 조금 설명해 주시겠습니까? 이 질문에 대한 다른 답변에는 정규식의 각 부분이 수행하는 작업에 대한 설명 수준이 부족하다는 것을 알 수 있습니다.
Wai Ha Lee
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.