2017-02-02 2 views
2

4 개 이상의 문자가 포함 된 문자열과 일치해야하는 정규식을 작성하려고합니다. 반드시 순서대로 정렬되지는 않습니다.문자열의 4 글자를 일치시키는 정규식

입력 문자열에는 대문자, 소문자, 숫자, 비 알파 문자 등이 혼합되어있을 수 있습니다. 대문자 또는 소문자가 4 자 이상이면 정규식 테스트를 통과해야합니다.

나는 유효한 입력을하고 싶습니다 무엇의 예는 아래에 볼 수 있습니다 :

a124Gh0st 나는 현재 정규식이 조각 작성했습니다 :

(?(?=[a-zA-Z])([a-zA-Z])|) 

을 5 개의 일치 항목을 성공적으로 반환하지만 입력 문자열에 1 자 이상이있는 한 현재는 항상 통과합니다. {4,}를 끝에 추가하면 작동하지만 단 4 개의 글자가있는 상황에서만 작동합니다.

내가 해왔 던 것을 테스트하기 위해 다음 웹 사이트를 사용하고이에 regex101

어떤 도움을 크게 감상 할 수있다.

+1

"^ ([^ a-zA-Z] * [A-Za-z]) {4}'또는'(? s)^([^ a-zA-Z] * [A-Za-z]) {4}. *'. –

+0

완벽합니다. 나는 두 번째 것을 게시했습니다 : (? s)^([^ a-zA-Z] * [A-Za-z]) {4}. 응답. – GradviusMars

답변

2

당신은

(?s)^([^a-zA-Z]*[A-Za-z]){4}.* 

또는

^([^a-zA-Z]*[A-Za-z]){4}[\s\S]* 

regex demo를 참조 사용할 수 있습니다.

세부 :

  • ^ - 문자열의 시작
  • ([^a-zA-Z]*[A-Za-z]){4} - 정확히 4 시퀀스 : -
  • [A-Za-z] ASCII 문자가 아닌 다른 0+ 문자 -
    • [^a-zA-Z]* 아스키 편지
  • [\S\s]* - 0 이상의 문자 (DOTALL 수정자가 사용 가능한 경우 .*과 동일).
+0

BTW, 위의 정규 표현식에서는 [. * *]을 사용할 때 발생할 수있는 성능 문제를 제거하기 위해 [contrast of principle] (http://www.rexegg.com/regex-style.html#contrast)이 사용됩니다. 또는 아래의 해답과 같이'. *? '. 명시 적 앵커링 (여기,'^'는 문자열의 시작 부분에 매치를 고정 시킴)은 다중 매칭 알고리즘이 적용되고 전체 문자열에 대해 한 번만 실행하면됩니다. '. *'/'[\ s \ S] *'는 정규 표현식을 패턴에 대해 * 테스트 * 할 때 사용할 수있는 선택 사항이며 전체 문자열 일치가 필요하지 않습니다. –

1

왜 각 문자 사이에 0 개 이상의 문자가 일치합니까? 예 :

(?:[A-Za-z].*){4} 

[A-Za-z]과 같습니다. .은 임의의 문자와 일치하므로 .*은 임의의 숫자 (0 포함)로 실행됩니다. 문자의 수만큼 뒤에 오는 문자 그룹이 네 번 반복되므로이 패턴은 적어도 네 개의 문자가 문자열에 나타나는 경우에만 일치합니다. (패턴의 네 번째 반복의 후행 .*은 0 문자와 일치 할 수 있으므로 대부분 중요하지 않습니다.)

마지 못해 한정 기호를 지원하는 정규식 언어를 사용하는 경우이 패턴을 사용하면이 패턴을 훨씬 더 효율적으로 만들 수 있습니다. 예를 들어, Java 또는 Perl로, 하나는

(?:[A-Za-z].*?){4} 

.*?은 여전히 ​​모든 문자의 번호와 일치 사용하는 것을 선호 수도 있지만 매칭 알고리즘은 이러한 각 실행 가능한 한 적은 수의 문자와 일치합니다. 이렇게하면 수행해야하는 역 추적의 양이 줄어 듭니다. 이 특정 패턴의 경우 필요한 역 추적을 0으로 줄입니다.

당신이 당신의 정규식 방언 꺼려 한정사가없는 경우, 당신은 좀 더 자세하게 같은 바람직한 효과를 달성 할 수있다

(?:[A-Za-z][^A-Za-z]*?){4} 

만이 아닌 문자는 문자 사이의 실행에 일치됩니다.

이 경우에도 패턴은 모든 정규식 플레어 (비 캡처 그룹, 열거 형 한정 기호)에없는 일부 정규식 기능을 사용하지만 원래 정규식에 있습니다. 최대한 호환되는 양식을 작성하려면 다음을 작성하십시오.

[A-Za-z][^A-Za-z]*[A-Za-z][^A-Za-z]*[A-Za-z][^A-Za-z]*[A-Za-z] 
+0

'(? : [A-Za-z]. *) {4}'패턴은'[A-Za-z]'가 매치하는 것과 동일한 문자와 일치하므로 중복 된 backtracking을 사용합니다. –

+0

@ WiktorStribiżew, 참으로 그렇습니다. 여러분이 그 의견을 말하고있을 때 나는 마지 못해 한정어를 사용할 수있는 경우이를 사용하라는 권고안을 작성했습니다. 나는 마지 못해 마지 못해 한정어에 의존하지 않는 대안을 추가 할 것이다. –

+0

[ "명암비는 아름답습니다."] (http://www.rexegg.com/regex-style.html#contrast) 지연되거나 꺼리는 수정 자도 성능에 영향을줍니다. –

관련 문제