2014-11-16 2 views
1

문자열에 k 개의 다른 문자가있을 때마다 정규 표현식을 일치 시키려고합니다. 즉, k=2 인 경우 aaaa 또는 a과 일치하지만 abc은 일치하지 않습니다. regex가 이것을 할 수 있습니까? 그렇다면 변수 k을 일치 표현식에 전달할 수 있습니까?다른 문자 수의 정규식

+0

_ 문자 유형이 무엇입니까? 'k' 다른 문자를 의미합니까? – Barmar

+1

당신은 부정적인 lookaround와 함께 이것을 할 수 있을지 모르지만 나는'k'의 각 값에 대해 regexp를 맞춰야 할 것입니다. 이것은 정규 표현식보다 문자열 처리 코드로하는 것이 훨씬 쉬운 것처럼 보입니다. – Barmar

+0

@Barmar yeah, thats what mean –

답변

1

정규 표현식을 구성하고 정규 표현식에서 숫자를 대체하는 것이 아니라 정규 표현식을 구성해야합니다.

k 개 이하의 문자로 검색하는 대신 정확히 k 개 이상의 문자로 검색 할 수 있습니다. k = 1의 경우

는 :

^(.).*?((?!\1).) 

이 2 개 이상의 서로 다른 문자 (즉 엄격하게 1 개 이상의 문자)와 임의의 문자열과 일치합니다. k = 2의

: 상기와

^(.).*?((?!\1).).*?((?!\1|\2).) 

같은,이 3 개 이상의 서로 다른 문자 모든 문자열과 일치합니다.

끝 부분에 더 많은 숫자를 추가하여 을 확장 할 수 있습니다. 여기서 앞쪽 캡처 그룹에서 캡처 된 모든 문자가 네거티브 미리보기 내부의 패턴에 의해 검사됩니다.

원래의 문제로 돌아가서 ^ 뒤에 패턴을 배치하면 음수 앞뒤가 일치하는 것을 부정하기 만하면됩니다. k에 대한 예를 들어

= 2 : 패턴 위에 만 경기를 반환합니다

^(?!(.).*?((?!\1).).*?((?!\1|\2).)) 

(문자열 ^의 시작과 부정적인 모습 미리 이후, 빈 문자열의 제로 너비) 문자열에 k 이하의 고유 문자가있는 경우

이 방법에 대한주의 사항이 있습니다. 캡처 그룹과 역 참조의 수는 k으로 증가하기 때문에 패턴에서 허용되는 캡처 그룹 수를 초과 할 수 있습니다.

또한 정규식은 k 일 때 비효율적이며 최악의 경우는 k 개의 별개 문자가있는 문자열입니다. 한 가지 방법은 구성을 변경하여 .*? 부분이 이전 캡처 그룹에서 캡처 된 문자 만 일치하도록 제한하는 것입니다.

^(?!(.)(?:\1)*((?!\1).)(?:\1|\2)*((?!\1|\2).))