2010-08-03 5 views
2

질문과 거의 같습니다. 나왔어정확히 3 b (bbb)의 서브 문자열을 사용하지 않고 {a, b}와 (과) 정규 언어를 정의하는 Regex

(ba)?(a + bb + bbbbb + aba)*(ab)?

더 읽을만한 것이 있습니까? 아니면이 잘못입니까? 당신이 정말로 갈 수있을 때 Regex로 이런 일을하지 말아야한다는 것을 알고 있습니다! ~/bbb/당신의 코드에서,하지만 그것은 이론 연습입니다.

감사합니다.

명확화를 위해 편집 : |을 사용하여 Regex에서 OR 비트를 나타내고 대신 +을 사용하고 있습니다. 혼란을 드려 죄송합니다.

편집 2 : {a,b}은 'a'와 'b'문자가있는 언어입니다. {최소, 최대} 아닙니다. 다시 미안 해요.

편집 3 : 이것은 이론 수업의 일부이기 때문에 Regex의 기본 사항 만 다루고 있습니다. 당신이 사용할 수있는 유일한 것들은 +,?,()와 *입니다. {minimum, maximum}은 사용할 수 없습니다.

+0

질문을 이해할 수 없습니다. '{a, b} '는 몇 번 반복해야 하는지를 의미합니다. {a, b} 및 bbb의 예를 제공해주십시오. 나는이 Bs들이 다른 점을 두려워합니다. –

+1

먼저 DFA를 고안 한 다음 RE로 변환하려고 할 수 있습니다. 나는 그것이 과거에 매우 유용하다는 것을 알았다. – dave

+0

그래, 사실. 내 부분에 Brainimplosion, 미안해 =) 혼란스런 사람들을 피하기 위해 원래의 설명을 삭제하겠습니다. – Jens

답변

1

나는 정규식이 있다고 생각한다. - 내가 지금 발명 한 표기법입니다. 세 개 이상 일치하는 정규 표현식을 제외하고는 0이나 그 이상의 b와 일치하는 정규 표현식을 사용하십시오. 이 내용은 (ε | b | bb | bbbb+)으로 바꿀 수 있으므로 마술이나 다른 것을 사용하고 있어도 걱정하지 마십시오. 이제 일치하는 문자열은 일 수있는 이 계속되는 0 개 이상의 a 부분 패턴을 반복하는 것으로 볼 수 있지만 적어도 하나의 "a"가 b 시퀀스 사이에 있어야한다고 생각합니다. 따라서 최종 정규식은 a*b°(a+b°)*입니다.

가 빈 문자열과 일치 할 수 있기 때문에 a+가 선택할 수로, 초기 a*가 불필요 초기 정규식이 b°(a+b°)* (감사, wrikken)까지 최적화 할 수 있도록, 그냥 괜찮아요.

+0

나는 upvotes가 있지만 그래,이 작품. OP에 대한 간단한 메모 : Cirno는 빈 문자열을 나타내는 데 ε (엡실론)을 사용하지만 교과서는 λ (람다)를 대신 사용할 수 있습니다. 그러나 의미는 변함이 없습니다. – bcat

+1

'b °'= _zero 이상 b's_ 인 경우'a * b ° (a + b °) *'에'a *'를 놓을 수 있습니다 (그래서'b ° (a + b °) * ') – Wrikken

+0

마지막 질문 '(a + b0) *'에서 +는 '하나 이상'또는 '선택 사항 (OR)'을 의미합니까? 만약 당신이 전 (前者)을 의미한다면, 'a'로 끝나는 것이 틀림 없습니다. –

1

흠,이게 뭔가요?

^(a|(?<!b)b{1,2}(?!b)|b{4,})*$ 

편집 :

편집 3 :이 이론 클래스의 일부이기 때문에, 우리가 정규식의 기본 사항을 처리하고 있습니다. 당신이 사용할 수있는 유일한 것들은 +,?,()와 *입니다. {minimum, maximum}은 사용할 수 없습니다.

풋, 등 뒤로 손을 묶는에 대해 이야기 ... 간단한 솔루션 : 당신은 (^ & $요구 사항 이제까지 작동하려면 있습니다), 그리고 우리는 |을 필요로 그것을 할 수 없습니다. 그래서, 더 좋은 조건을 생각 해낸다. & 내다 할 수있는 lookbehind을 삭제하지만, (적어도하지 DRY를 위반하지 않고) 꽤 될 수 없습니다 :

^(b|bb|bbbb+)?(a+(b|bb|bbbb+)?)*$ 
+0

아니,^및 $ 특정 정규식에서 솔루션을 표현할 때 요구 사항입니다. 여기서 그들이하는 일은 전체 표현식이 정규 표현식의 일부가되도록하는 명령이지만, 이론적 질문에서는 정규 표현식이 전체 문자열에 대한 것으로 가정 될 수 있습니다. 나는'|'에 대해서 모른다. 그것은 일반적으로 기본 ('+'와는 달리)으로 간주됩니다. –

+0

죄송합니다. 이렇게하는 것이 극도로 비효율적 인 것처럼 보일 수도 있지만 강사가 우리에게 이러한 제한 사항을 제시하고 해결 방법을 제시하도록 요청했습니다. 어쩌면 그는이 정확한 지점을 만들려고 노력했을 것입니다. –

0

당신은 행에서 정확하게 3 ㄱ의없이 문자열을 일치하고 있습니다. 즉, "aa", "aba", "abba"및 "abbbb * a"와 같은 하위 문자열을 볼 수 있습니다. 여기서 a는 문자열의 시작이나 끝 부분이 될 수 있으며 겹칠 수 있습니다. 배수 여야합니다. (가) 문자열의 시작 부분에 누락을 고려하여 적절한 추가로

(a + ab + abb + abbbbb*)* 

:이 같은 것을 제안합니다. 많은 반복이 있지만 정규 표현식이 기본 형식으로 작동하는 방식입니다.

+0

'bb'또는 'bbbbbbb'이 잘못된 것이 아니라면이 Regex에서 유효하지 않습니다. –

+0

오른쪽 - a로 시작하는 문자열 만 허용합니다. 숙제 문제이므로 문제 해결에 도움을 드리 겠지만 완전한 솔루션을 게시하지는 않습니다. –