2010-01-24 6 views
0

5 개의 a와 5 개의 b로 모든 문자열을 일치시키는 정규식을 만들 수 있습니까?더 많은 문자열 일치 기능

aaaaabbbb 또는 ababababab 또는 aabbaabbab과 같습니다.

결정 성있는 엔진의 경우 다항식 시간이 필요할 것이라고 상상해보십시오.

일치하는 다른 언어가 있습니까?

업데이트는 :

내가 검색을위한 표현의 종류를 사용하고 싶었, 그래서 나는 (?=b*ab*){5}(?=a*ba*){5}([ab]{10})로 작정 한을 변경하고 그것을 잘 작동! :) 나는 그런 표정의 수행에 관하여 여전히 불확실하다. 그러나 나는 lookahead 표현식을 찾을 수있을 것 같아.

나는 설명하기 쉽지만 정규 표현식이 어려운 다른 종류의 패턴이 거기에 있는지 궁금하다.

+2

하나의 for 루프를 사용하는 간단한 O (n) 연산을 쓸 수 있습니다.) –

+0

실제로 호기심을 묻고 있습니까? 이것은 당신이 정규식을 사용하고자하는 일종의 문제가 아닙니다. – MAK

답변

5

당신은 lookahead assertions를 사용할 수 있습니다

^(?=(?:[^a]*a){5}[^a]*$)(?=(?:[^b]*b){5}[^b]*$) 
+0

미리보기 뒤에'. {10} $ '을 추가 할 수 있습니다. 명세는 분명하지 않지만 예제에서 볼 때 문자열에는 정확히 5 a와 5 b가 포함되어야하고 다른 것은 포함되지 않아야합니다. –

+0

@Tim Pietzcker : 그 cas에서 나는'[^ a]'를'b'와'[^ b]'로'a'로 대체하려고합니다. – Gumbo

+0

사실 저는'(? = (? : [^ a] *) {5} [^ a] *) (? = (? : [^ b] * b) {5} [^ b] *) . {10})'문자열을 검색하는 'aababababab'과 잘못된 부분을 발견 :'aababababa '. 미리보기 문자 제한을 설정할 수 없다면 수정 방법이 보이지 않습니까? –

6

나는이 모든 나사가 있습니다. 나무 조각에 그들을 망치로 넣으려면 발톱이나 볼펜 망치를 사용해야합니까?

귀하의 질문에 대해 (대략) 답변드립니다. 당신이 해야합니까합니까 그냥 문자열의 각 문자를 통해 루프입니다. 내가 C. 시계에서 작업을 수행 할 수 있습니다

int validate(char *s) 
{ 
    int a = 0, a = 0; 
    while(*s) 
     { 
     switch(*s++) 
     { 
     case 'a': 
      a++; 
      break; 
     case 'b': 
      b++; 
      break; 
     } 
     } 
    return a == 5 && b == 5; 
} 

그것은이에 당신에 대한 훈련으로 남아있는) 선택의 언어이 변환, B) '는의와'B 년대의 연속적인 순서에 맞게이를 수정 (원하는 경우) 또는 다른 특정 요구 사항을 조정할 수 있습니다.

기본 사항은 정규 표현식보다이 작업에 더 나은 도구가 있다는 것입니다. 따라서 "a"와 "b"가 더 복잡한 정규 표현식의 독립형이 아니면, 정규 표현식을 사용하지 마십시오. 그리고 "a"와 "b"가 정말로 더 복잡한 정규 표현식 일지라도, 당신은 하나의 정규 표현식으로 모든 문제를 해결할 필요가 없습니다. 거대한 (그리고 유지 보수가 불가능한) Regex-zilla보다 훨씬 훌륭한 효과를 내기 위해 몇 가지 유용한 regexes와 코드 루프 (위와 같음)를 혼합 할 수 있습니다.

+0

저는 필터와 같은 문자열에 둘 이상의 일치하는 정규식을 적용하는 아이디어를 좋아합니다. 그러나이 방법은 확실하게 정규식 findall과 sub를 사용하는 것을 어렵게 만들 것입니까? –

+0

네,하지만 제가 준 코드는 (일치하는) 모든 인스턴스를 찾거나 (인스턴스의 인덱스를 찾는) 조정할 수 있습니다. 'findall'과'sub' 함수를 수행 할 함수의 변종을 작성할 수 있습니다. 여러 regexes를 하나의 메가 regex 객체로 컴파일하고 복잡한 일치 동작을 지정할 수있는 모듈을 만들 수도 있습니다 (예 : superegex.compile ("a^5 b^5", a = "a regex", b = "b regex")'아마도)이 일을 더 쉽게 할 수 있습니다. 아마 이해하기 쉽고 유지 보수가 쉬울 것입니다 (그리고이 일을 다시해야 할 때 더 유용 할 것입니다). –

+0

또한 정규식 질문을 할 때 사용중인 언어를 지정해야합니다. 다른 언어는 regexes를 다르게 처리하기 때문에 순수 정규식 솔루션을 제공 할 수 있다고하더라도 언어의 정규 표현식에서는 작동하지 않을 수 있습니다. 게다가 파이썬을 사용하고 있다고 말하면 대안 접근법을 사용하는 것이 더 나을 것이라고 생각한다면 도움이 될 수 있습니다. –