2014-10-16 6 views
0

정규식 바꾸기를 수행하려고합니다. 그 때문에 나는 다음과 같은 식 정의 :정규식 반복

^(?:9903[0]*([0-9]*)){20}$ 

이 표현은 사실, 표현은 위의 I 때까지 작동하지 않습니다

9903111111111111111 

99030000000000000001 
    99030000000000000011 
    99030000000000000111 
    99030000000000001111 
    99031111111111111111 

하지만에 일치해야합니다을 중 하나를 사용 { 1,20}을 수량 기호로 사용하거나 완전히 제거하십시오. 그러나 [0] 길이 나 변수의 길이를 모른 채 전체 문자열의 길이를 확인하기 위해 내 표현에 문제가 있습니다.

미리 도움을 주셔서 감사합니다.

D

+0

'^ (?: 66) {2} $', 길이는 4가 아니어야합니다. 2. –

+1

예제가 명확하지 않으므로 9903 다음에 숫자가 올 수 있습니까? –

+0

'[0] * [0-9] *'와 일치시키려는 것은 무엇입니까? – Toto

답변

0

초기 정규식에 여러 가지 문제가 있습니다.

{} 부분은 괄호 안에 부분이 전체적으로 부분에 적용됩니다. 그래서 당신의 현재 정규식은이 부분을 필요로합니다 :

(?:9903[0]*([0-9]*)) 

당신이 원하는 것이 아닌 전체를 20 번 반복합니다.

그리고이 부분 :

[0]*([0-9]*) 

는 거의 의미가, 당신은 0이 붙지 않는 9903 후 수를 캡처 하시겠습니까? 그런 다음 캡처가 0이 아닌 숫자로 시작하도록 요구하십시오. [0]은 문자가 하나 뿐인 문자 클래스로, 단지 0과 같습니다.

결론, 그래서처럼 할 것 :

^9903(?=[0-9]{16}$)0*([1-9][0-9]*)$ 

Regex101

편집 : 나는 그것이 99,030000000000000000 일치하는 데 필요한 않다면 (캡처 그룹에 0을 얻을) 것을 나중에 깨달았다 다음 너는 이것을 필요로한다 :

^9903(?=[0-9]{16}$)0*([0-9]+)$ 

Regex101

+0

첫 번째 해결책은 저에게 해 주셨습니다. 많은 감사드립니다! –

0

당신은 lookahead로 이전 문자열의 길이를 확인하여 그렇게 할 수 있습니다

^(?=[0-9]{20}$)99030*[0-9]* 

룩어 (?=...)는 제로와 문자열에 다음 것을 확인 주장. 여기서 문자열 끝에 정확히 20 자리가 있는지 확인합니다.