숫자 만 정규식


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.