2017-02-02 6 views
-1

무제한 숫자는 있지만 제한된 밑줄에 대해서는 정규 표현식을 찾으려고합니다.무제한 숫자이지만 제한된 다른 문자에 대한 정규 표현

그럼 max_underscore = 3이라고 가정 해 보겠습니다.

그런 다음

123_456_678는 확인 (3 개 밑줄)
1234213_2132135678입니다 확인 (2 개 밑줄)

그러나

13_4156_7_012_1이 확인되지 않습니다 (4 개 밑줄)

+0

가능한 중복 (http://stackoverflow.com/questions/4736/learning -regular-expressions) – Sayse

+1

FWIW, 정규식이 필요하지 않습니다. 대부분의 언어는 문자열에서 문자의 발생 횟수를 찾는 방법이 있습니다. – Sayse

+0

그렇다면 실제로 사용하는 언어/도구는 무엇입니까? –

답변

2

밑줄은 시작 부분이나 끝 부분에 허용되지 않습니다이 허가되어 있지 않은 경우 2 개 이상의 연속 밑줄 :

^(?:\d+_?){3}\d+$ 

밑줄이 시작 부분이나 끝 부분에 허용되는 경우 :

^(?:\d*_?){3}\d*$ 

이 정규식 일치 문자열의 밑줄은 0에서 3까지이지만 그 이상은 아닙니다.

작업에서이 2 개 개의 정규 표현식에 참조 :

$strings = array(
'123456', 
'1_2_3_456', 
'123_456', 
'_123_456_', 
'1_2_3_4_5_6', 
'123___456', 
); 
$num = 3; 
echo 'using "^(?:\d+_?){3}\d+$"',"\n"; 
foreach($strings as $string) { 
    if (preg_match("/^(?:\d+_?){".$num."}\d+$/", $string)) { 
     echo "OK: $string\n"; 
    } else { 
     echo "KO: $string\n"; 
    } 
} 
echo 'using "^(?:\d*_?){3}\d*$"',"\n"; 

foreach($strings as $string) { 
    if (preg_match("/^(?:\d*_?){".$num."}\d*$/", $string)) { 
     echo "OK: $string\n"; 
    } else { 
     echo "KO: $string\n"; 
    } 
} 

출력 : [정규 표현식을 학습]의

using "^(?:\d+_?){3}\d+$" 
OK: 123456 
OK: 1_2_3_456 
OK: 123_456 
KO: _123_456_ 
KO: 1_2_3_4_5_6 
KO: 123___456 
using "^(?:\d*_?){3}\d*$" 
OK: 123456 
OK: 1_2_3_456 
OK: 123_456 
OK: _123_456_ 
KO: 1_2_3_4_5_6 
OK: 123___456 
1

당신이 할 수있는 경우이다 다른 문자 각각을 나타냅니다. 3 예를 들어

는 밑줄이 두 개의 연속 허용하는 것이

\d*(_\d*(_\d*(_\d*)?)?)? 

참고 : 3 이하 밑줄을 일치 시키려면

\d*_\d*_\d*_\d* 

, 당신은 선택 정규식의 부품을 만들 수 있습니다 문자열 시작과 끝 부분에서 밑줄과 밑줄을 사용하면 * 대신 + 대신 +을 사용할 수 있습니다.

\d+_\d+_\d+_\d+ 
+0

요청한대로 밑줄이 3보다 작은 문자열과 일치하지 않습니다. – Toto

+0

@ 사진 오른쪽, 내 대답을 편집했습니다. – Aaron