2012-10-05 8 views
3

같은 일치 조건을 여러 구분 기호에 적용 할 수있는 정규식이 있습니다. [], ()<>이 모두 유효합니다. 예 목적은 다음과 같습니다 : 위의 정규식에서 중복을 제거 할 수있는 방법은여러 가능한 구분 기호가있는 정규식에서 중복을 제거

\[.\]|\(.\)|<.>

있습니까? 구분 기호 안의 일치 기준은 항상 동일하지만 구분 기호 자체는 다를 수 있습니다.

답변

1

나는

[[(<].[])>] 

정확한 충분하지 않기 때문에 당신이 명백한 이유를 묻는 것 같은데요.

가능한 모든 방법을 확인했는지 확인하기가 어렵 기 때문에 "아니오, 방법이 없습니다."라는 대답은 항상 위험합니다. 그런 경우에 답을 얻을 수있는 확실한 증거를 제시해야합니다.

나는이 강한-충분한 증거, 또는 전혀 심지어 "증거"입니다 모르겠지만,이 (사이비) 정보 이론의 관점을 고려

  1. PCRE 엔진 자체가 문자 쌍 사이의 관계에 대한 지식이 없습니다. [], ()<>. 따라서 표현 자체에 해당 정보가 포함되어야합니다. 이상이어야합니다.은 6 문자 []()<>이 있어야합니다.

  2. 뿐만 아니라

    있지만, 마찬가지의 이유로, 식 자체는 두 쌍들 적어도 정의해야한다 (제 떠나는을 암시한다). 나는 두 개의 교대 연산자 (|)가 당신이 할 수있는 최선이라는 것을 증명하는 방법을 모르지만, 심지어 이 더 작은 방법 인 경우에도 을 한 문자로 저장하려고합니다. "Pairings exists!"라고 말하기 위해서는 적어도 한 비트가 필요하기 때문입니다.

  3. 메타 문자를 이스케이프 처리하는 것은 []()이 이스케이프 처리되지 않고 문자 클래스 내에 나타날 수 있지만 실제로는 "중복성 제거"가 실제로는 "a 행운의 상황에서 구문 "및 두 번째로, 당신은 여전히 ​​문자 클래스의 정의에 대한 두 개의 문자 : []을 추가해야합니다.

  4. 따라서, 내 믿음은 심지어 이론적 관점에서, 경우 정규식 엔진이 다음 하나는 이미했습니다 정규식에서 가장 세 문자에서 을 절약 할 수 있습니다, 참 알 수없는 일에 대해 내 가정 사항 제공 : \[.\]|\(.\)|<.>.

나는 정규식 전문가에 의해 시정 될 것을 고대하고있다!

1

당신이 정말로, 서브 루틴을 만들과 같이하는 그룹을 DEFINE 사용할 수 있습니다 (예를 들어, PHP를 통해) PCRE library를 사용하는 경우 더 판독 가능

'~(?(DEFINE)(?<content>\w+))(?:<(?&content)>|\[(?&content)\]|\((?&content)\))~' 

... 나 :

(?(DEFINE)(?<content>\w+)) 
(?: 
    <(?&content)> 
    | 
    \[(?&content)\] 
    | 
    \((?&content)\) 
) 

PHP의 경우 demo입니다. Perl에서도 작동해야합니다.

관련 문제