2012-03-28 4 views

답변

0

& 연산자 (교차로)와 ~ (보완) 사용 : 이러한 연산자없이 재 작성

(a|b|c)*&~(.*(aa|cc).*) 

은 까다 롭습니다. 일반적인 접근법은 사례로 분해하는 것입니다.

이 경우 모두 어렵지 않습니다.

문자 c이 사진에서 추출되었다고 가정합니다. aabb이없는 다음 유일한 순서는 다음과 같습니다 우리가 할 수있는 일

e (empty string) 
a 
b 
b?(ab)*a? 

다음은 가능한 모든 실내 장소에 일부 옵션 'C'실행을 삽입 할 수 있습니다 :

e (empty string) 
a 
b 
(bc*)?(ac*bc*)*a? 

다음으로, 예를 들어 acacbcbc'. We allow a final a and b . This pattern can take care of our loneand b` cases뿐만 아니라 빈 문자열이 일치하는 경우와 같이 비 선택적 'c'실행이 중간에있는 경우 aabb과 같은 불법 시퀀스가 ​​허용된다는 것을 인정해야합니다.

(ac+|bc+)*(a|b)? 

그런 그들을 함께 결합 :

((ac+|bc+)*(a|b)?|(bc*)?(ac*bc*)*a?|(ac+|bc+)(a|b)?) 

을 우리는 거의있다 : 우리는 또한이 패턴은 한 C'-s '을 (를) 분할이 있기 때문에, 원하는만큼 발생할 수 있음을 인식 할 필요가 발행 수 사이에, 임의의 선행 또는

이 이
c*((ac+|bc+)*(a|b)?|(bc*)?(ac*bc*)*a?|(ac+|bc+)(a|b)?)(c+((ac+|bc+)*(a|b)?|(bc*)?(ac*bc*)*a?|(ac+|bc+)(a|b)?))*c* 

씨 정규식 Philbin, 나는이 처리하지 않는 모든 경우에오고, 그래서 아니에요 나는 '모든 것이 주위 c -s의 실행을 후행 그것을 그대로두고 떠난다. 내 마지막 대답. 이것은 단순히 aabb 검색하고, 예를 들어, 당신의 논리를 부정 할 수있는 순수하게 격식을 중요시하는 질문이 아닌 경우

4

:

s='abcccabaa' 
# continue if string does not match. 
if re.search('(?:aa|bb)', s) is None: 
    ... 

을하거나 두 개의 패턴 문자열을 스캔, 비싼 정규 표현식을 피하는 :

if 'aa' not in s and 'bb' not in s: 
    ... 

같은 쉬운 작업 RE의 경우는 아마 총 과잉이다.

피씨 : 예는 파이썬이지만 원칙은 물론 다른 언어에도 적용됩니다.

+0

+1 정규식 이외의 솔루션을 제안합니다. 문자열 스캔 솔루션은 이해하기가 훨씬 쉽고 속도도 빠릅니다. –

+0

예, RE를 사용하지 않는 옵션은 종종 고려되지 않습니다. 이온이 많은 질문은 어떤 경우에 더 빠를 것입니다. – hochl

+0

컴파일 된 정규식은 필요한 역 추적의 양에 따라 생각보다 빨리 수행되는 경우가 많습니다. 문자열 연산을 하나의 정규 표현식으로 대체 할 수 있다면 정규 표현식을 사용하지 않고도 역 추적 할 필요없이 정규 표현식이 문자열 연산보다 * 빠릅니다. –

0
^(?!.*(?:aa|bb))[abc]+$ 

  1. 당신의 문자열 만 구성되어 있는지 확인이 here on Regexr

    이 정규식은 두 가지

    을 할 것보기, b와 c
  2. 금주 모임에 실패하고 BB

^은 별과 일치합니다. 이 문자열

[abc]+character class에 AA 또는 BB가에만 A, B를 허용하는 경우 문자열의 t는

(?!.*(?:aa|bb))negative lookahead assertion

, C, 적어도 하나의 ( +)

$ 최종 일치 실패 문자열의

+0

이 Perl cruft는 정규 표현식으로 간주되지 않습니다. – Kaz

+0

왜 그렇게 생각하니? 이것은 완벽하게 유효한 perl 정규식입니다. 어쩌면 당신은 perl 정규 표현식의 근대적 인 힘을보아야한다 : [perlretut] (http://perldoc.perl.org/perlretut.html). – stema

관련 문제