a
, b
및 c
의 문자열에 대해 aa
및 bb
과 같은 정규식을 만드는 방법은 거부됩니까?연속되지 않는 문자와 일치하는 정규식을 만드는 방법은 무엇입니까?
예를 들어, abcabccababcccccab
이 허용되며 aaabc
또는 aaabbcccc
또는 abcccababaa
이 부인됩니다.
a
, b
및 c
의 문자열에 대해 aa
및 bb
과 같은 정규식을 만드는 방법은 거부됩니까?연속되지 않는 문자와 일치하는 정규식을 만드는 방법은 무엇입니까?
예를 들어, abcabccababcccccab
이 허용되며 aaabc
또는 aaabbcccc
또는 abcccababaa
이 부인됩니다.
& 연산자 (교차로)와 ~ (보완) 사용 : 이러한 연산자없이 재 작성
(a|b|c)*&~(.*(aa|cc).*)
은 까다 롭습니다. 일반적인 접근법은 사례로 분해하는 것입니다.
이 경우 모두 어렵지 않습니다.
문자 c
이 사진에서 추출되었다고 가정합니다. aa
및 bb
이없는 다음 유일한 순서는 다음과 같습니다 우리가 할 수있는 일
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 lone
and
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의 실행을 후행 그것을 그대로두고 떠난다. 내 마지막 대답. 이것은 단순히 aa
및 bb
검색하고, 예를 들어, 당신의 논리를 부정 할 수있는 순수하게 격식을 중요시하는 질문이 아닌 경우
:
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의 경우는 아마 총 과잉이다.
피씨 : 예는 파이썬이지만 원칙은 물론 다른 언어에도 적용됩니다.
+1 정규식 이외의 솔루션을 제안합니다. 문자열 스캔 솔루션은 이해하기가 훨씬 쉽고 속도도 빠릅니다. –
예, RE를 사용하지 않는 옵션은 종종 고려되지 않습니다. 이온이 많은 질문은 어떤 경우에 더 빠를 것입니다. – hochl
컴파일 된 정규식은 필요한 역 추적의 양에 따라 생각보다 빨리 수행되는 경우가 많습니다. 문자열 연산을 하나의 정규 표현식으로 대체 할 수 있다면 정규 표현식을 사용하지 않고도 역 추적 할 필요없이 정규 표현식이 문자열 연산보다 * 빠릅니다. –
^(?!.*(?:aa|bb))[abc]+$
이
이 정규식은 두 가지
을 할 것보기, b와 c^
은 별과 일치합니다. 이 문자열
[abc]+
character class에 AA 또는 BB가에만 A, B를 허용하는 경우 문자열의 t는
(?!.*(?:aa|bb))
negative lookahead assertion
+
)
$
최종 일치 실패 문자열의
'aa'와'bb'를 검색하고 결정을 뒤집기 쉬울 것입니다. – hochl
그런데이 숙제가 있습니까? – Kaz