2009-04-24 5 views
4

주어진 문자열 java.util.regex.Pattern에 의해 첫 번째 문자으로 일치 할 수있는 모든 문자 집합을 문자열로 계산할 수 있기를 원합니다. 보다 공식적으로 DFA가 특정 정규식과 동일한 경우 시작 상태에서 나가는 모든 전환 집합을 원합니다.정규식 패턴과 일치하는 첫 번째 문자 집합을 결정할 수 있습니까?

예 :

Pattern p = Pattern.compile("[abc]def|daniel|chris|\\s+"); 
Set<Character> first = getFirstSet(p); 

first는 다음과 같은 요소가 포함되어야 세트 :

{ 'a', 'b', 'c', 'd', ' ', '\n', '\r', '\t' } 

어떤 아이디어? 나는 DFA를 직접 만들 수 있고 그런 식으로 관련 상태를 결정할 수 있다는 것을 잘 알고 있습니다. 그러나 그런 종류의 번거 로움을 피하고 싶습니다. (읽기 : 그만한 가치는 없습니다.) 내 호스트 언어는 실제로 스칼라이므로 모든 스칼라 라이브러리에 액세스 할 수있다.

답변

4

정규식을 구문 분석하고 구문 분석 된 정규식을 왼쪽에서 오른쪽 방향으로 조작하는 재귀 함수를 정의하여 이러한 첫 세트를 작성할 수 있다고 생각합니다.

어떤 것들은 간단하다 :

  • 순서 : 첫 번째 (r1r2) = 첫 번째 (R1) +() 첫 번째 (R2), 최초의 (R1에서 ''경우 다른 빈 세트)
  • 교대 : 처음 제 | (R1, R2) = 제 (R1) + (R2)
  • 반복 : 제 (R *) = 제 (R) + '
  • 문자'제 (c) = C
  • Characterclasses 첫째 ([c1-cn]) = 세트 (c1, c2, ..., cn) ...

정규 표현식의 방언이 알고있는 모든 프리미티브 및 특수 플래그에이 값을 확장하면 좋은 결과를 얻을 수 있습니다.

+0

그래, 나는 그것에 대해 생각했다. 이는 DFA의 프런트 엔드를 직접 제작하는 것과 실질적으로 동일합니다.어쩌면 내가이 일을 할 수는 있지만, 좀 더 간단한 해결책을 찾고 싶다. –

+0

(언어 표준의 고정 문법에 따라) 파싱하는 것보다 얼마나 단순 해지는 지 잘 모르겠지만 어쩌면 그건 내 컴파일러가 뇌에 주입 된 것일 수도 있습니다. – Tetha

+0

글쎄, 파싱하고 순회 트래버스 aren 너무 나쁘다. 나는 단지 FIRST를 얻기 위해 자바의 정규식 의미를 복제하는 것에 만족하지 않는다. –

1

당신은 괄호를 둘러싸의 ... 재귀 적

  • 스트립을 해결하고 재귀 적 호출 할 수 있습니다.
  • 최상위 레벨로 분할하고 각 파트를 반복적으로 호출하십시오.
  • 어떤 대안이없는 경우
  • ,
    • 출력 처음 없음 옵션 기호에 왼쪽부터 시작하는 모든 문자.
    • 문자 그룹이있는 경우 모든 기호를 출력하십시오.

은 아마이 아이디어에 많은 오류가있다, 그러나 이것은 내가 시도 할 것입니다. 단언, 그룹 이름 및 기타 천 가지를 제거해야합니다. [^ 0-9]와 같은 거꾸로 된 문자 클래스를 발견하면 많은 문자를 출력해야합니다.

그래서 나는 그것이 정말로 복잡한 문제라고 생각합니다.

+0

나는 부정 클래스에 대해 생각하지 않았습니다. Java가 UTF-8을 사용한다고 가정 할 때, FIRST 세트는 수십만의 크기를 가질 수 있습니다. 아야! 어쩌면 나는 정규 표현식이 무엇이든 일치 할 수 있다고 가정하고 최적화되지 않은 상태로 남겨 둘 것입니다 ... –

+0

방금 ​​표현식을 다시 작성하는 것에 대해 생각했습니다. 입력 표현식의 첫 번째 심볼과 일치하는 표현식을 작성할 수 있다면 반복 할 수 있습니다. 일부 단일 기호 문자열 및 파생 된 표현식이 일치하는지 테스트하십시오. 그러나 모든 문자를 얻으려면 전체 문자 세트를 반복해야합니다. 이는 유니 코드의 많은 작업입니다. 그리고 저는 그러한 파생 된 표현을 얻는 방법을 생각할 수 없습니다. 어쩌면 정규식 구현을 해킹하고 리플렉션을 통해 내부 상태를 검사 할 수 있습니다. –

+0

하지만이 모든 것은 아마도 정규 표현식 구현을 직접 작성하는 것으로 끝날 것입니다. 그래서 나는 (좋은) 생각에서 벗어났다. –

관련 문제