2012-09-19 2 views
1

1과 0의 동일한 수를 가진 정규 표현식을 찾는 방법 나는 또한 그런 해결책을 어떻게 생각 하느냐에 관심이 있습니까?0과 1의 동일한 수에 대한 정규 표현

예 : 은 (는) 1100, 00100111, 01과 일치해야합니다. 은 일치하지 않아야합니다 : 110, 0, 11001.

모든 문자열 세트를 제공하는 정규 표현식이 필요합니다. 2n에 정규 표현식으로 주어진 집합의 문자열 길이가 0s 인 경우 숫자는 1s = n과 같아야합니다.

일반 문법 (유한 상태 자동 장치) 불가능
+0

당신이 뭘하려고하는지 명확하지 않습니다. 일치해야하는 문자열과 일치하지 않아야하는 문자열의 예를 제공해주십시오. – lanzz

+0

또한 어떤 언어를 사용하고 있는지 또는 컴퓨터 과학의 의미에서 정규 표현에 대해 이야기하고 있는지 알려주십시오. – Jens

+2

정규식은 "그러한 모든 문자열 세트를 제공하지 않습니다". 그들은 패턴을 정의합니다. 가능한 모든 일치하는 문자열을 생성해야하는 경우 regex에 대한 작업이 아닙니다. 또한 어떤 종류의 과제 일 경우'[exam]'대신'[homework]'태그를 넣고 사용중인 프로그래밍 언어에 대한 태그를 추가하십시오. [편집] 링크를 눌러이 작업을 수행 할 수 있습니다. –

답변

0

이 다른 답변, 문자열을 검색하기가 상대적으로 용이해야한다에 명시된 바와 같이 정규 문법 불가능하지만은, 각각에 대해 카운터를 증가 1을 입력하고 각각 0에 대해 감소시킵니다. 최종 개수가 0 인 경우 01의 수는 동일합니다 (모듈로 2^단어 크기 - 오버플로를주의하면 조금 까다로울 수 있지만 입력과 관련하여 다른 가정이 존재하는지 여부에 따라 다름) , 그것은 필요하지 않을지도 모른다).

4

다음은 사용자의 요구를 충족시키는 .NET 엔진 용 정규식 패턴입니다. 작업은 ideone.com입니다.

^((?(D)(?!))(?<C>1)|(?(D)(?!))(?<-C>0)|(?(C)(?!))(?<D>0)|(?(C)(?!))(?<-D>1))*(?(C)(?!))(?(D)(?!))$ 

는 것보다 제로가 0 인 경우보다 더 curretly 1과 다른 하나 (D)이있는 경우, 하나의 (C)를 사용하여, 두 스택을 사용하여 작동한다.

꽤 사용 가능하지는 않지만 확실히 사용할 수는 없지만 작동합니다. (하!)

+0

그건 하나 더러운 해킹입니다. 나는 너의 모자를 벗고,이 런 타임은 정말 빨려 야한다. – Johan

+0

감사! =) 나는 프로덕션 코드에서 이것을 사용하지 않는다는 것을 자랑스럽게 생각한다. 하지만 문자열 길이 n에 대해서는 O (n)이 좋을 것입니다. 왜냐하면 많은 역 추적을하지 않기 때문입니다. 나는 더 나쁜 정규 표현식을 보았다. – Jens

3

언어 L = (0,1) (1과 0의 동일한 수)에 대한 일반 표현식을 생성 할 수 없습니다. 이것은 정규 언어가 아니므로 정규 표현식으로 설명 할 수 없습니다. 그것을 받아들이는 오토 마톤은 입력의 길이에 따라 다른 양의 메모리가 필요하기 때문에 규칙적이지 않다. 정규 언어는 입력 길이에 관계없이 상수 메모리를 사용하는 언어입니다. 설명하는 언어는 문맥 자유 문법으로 생성 할 수 있지만 정규 표현식으로 생성 할 수는 없습니다. 다음 CFG는 0의 숫자와 1의 숫자가 같은 문자열을 생성합니다. S가 해당 언어의 단어이면 S -> SS; S -> 0S1; S -> 1S0; S -> e 빈 단어 이 언어를 사용하려면 스택이 필요하고 푸시 다운 오토 마톤이이를 받아들이도록 설계하거나 튜링 기계를 사용할 수 있습니다.