2009-10-12 3 views
0

일반적인 텍스트 처리 도구 인 Texy!을 PHP에서 Java로 이식하려고합니다.Java Regexp : UNGREEDY 플래그

이 도구는 preg_match_all("/.../U")을 사용하여 모든 곳에서 일치하지 않는 항목을 찾습니다. 그래서 어떤 UNGREEDY 플래그가있는 라이브러리를 찾고 있습니다.

나는 .*? 구문을 사용할 수 있지만 실제로 덮어 써야하는 정규식이 많이 있으며 모든 업데이트 된 버전을 확인해야합니다.

내가

  • ORO을 확인했지만 - 그러한 라이브러리가 아니 지원

- 아니 지원

  • java.util.regex의 -
  • 자카르타 정규 표현식을 포기하는 것 ?

    감사합니다, 온 드라

  • 답변

    1

    수정 한 Java 라이브러리를 직접 만들 것을 제안합니다. java.util.regex 소스를 자신의 패키지에 복사하기 만하면됩니다.

    썬 JDK 1.6 Pattern.java 클래스는 이러한 기본 플래그를 제공합니다 : 당신은 이러한 플래그는 몇 번을 사용하는 것을 알 수 있습니다, 그리고 그것을 수정하는 사소한 것

    static final int GREEDY  = 0; 
    
    static final int LAZY  = 1; 
    
    static final int POSSESSIVE = 2; 
    

    .다음 예제를 참조하십시오.

    GREEDY 플래그 대신 'LAZY'플래그를 사용하도록 마지막 라인을 변경하기 만하면됩니다. 정규식 라이브러리가 PHP처럼 작동하기를 원하기 때문에 이것이 최선의 방법 일 것입니다.

    +0

    이미보고 있습니다 :) –

    +0

    실제로이 RFE에 대한 패치는 기본 반환 경로의 GREEDY를 플래그로 만든 변수로 바꾸는 것만 큼 간단합니다. 좋아요, JDK에 패치를 제출할 것입니다 :) –

    3

    업데이트 : 워드 프로세서를 확인한 후 나는 비 욕심이 또 다른 용어입니다 게으른 플래그를 발견했다. 그러나 단지 오픈 JDK

    에 출시 될 것으로 보인다
    p = Pattern.compile("your regex here", LAZY); 
    p.matcher("string to match") 
    

    원래 사용되지 응답 솔직히 일이 있다고 생각하지 않습니다.

    +? 그리고 *? 어느 섹션을 탐욕스럽게 할 것인지, 어떤 섹션을 느리게 할 것인지 선택할 수 있습니다.

    욕설은 이것이 정규식에서 +와 *의 가장 보편적 인 사용이기 때문에 욕창이 기본 동작입니다. 사실 나는 다른 방법으로 그것을 수행하는 하나의 정규식 파서를 생각할 수 없다. 욕심 많은 것을 만들기 위해 수정자를 사용하는 곳에서와 마찬가지로 기본값은 게으른 일치입니다.

    나는 이것이 당신이 찾고있는 해답이 아니라는 것을 알고 있습니다 만, 당신이 그것을 일하게 할 수 있다고 생각하는 유일한 방법은? 당신의 *와 +에. 위쪽에서 정규 표현식을 사용하여 변경해야하는 정규 표현식을 결정할 수 있습니다. 또는 모두 변경해야하는 경우에도 변경을 수행하십시오. 또는 변경할 필요가있는 패턴을 설명 할 수있는 경우

    +0

    기본 동작을 변경할 방법이 없다는 것을 말하고 있습니까? "가장 보편적 인 [...]"이유로 변경 될 수없는 기본 동작을 사용한다고해서 스위치를 가지고 있다는 것이 나쁜 생각이라는 것을 의미하지 않습니다. – hhafez

    +0

    나는 그것이 불가능하거나 심지어 불필요하다고 말하지 않았습니다. 나는 그저 여러 언어로 된 나의 경험을 토대로 그 말을했다. Asker가 preg_match_all ("/.../ U")을 언급 할 때까지 정규 표현식에 대한 게으름 전환을 본 적이 한번도 없습니다. – EmFi

    +0

    와우, OpenJDK에있을 때 Sun JDK에 포함시킬 가능성이 있습니다! 그리고 OpenJDK의 구현을 Sun JDK에서 사용할 수 있기를 바랍니다. 하지만 어디에서 찾았습니까? 문서에 없습니다 : http://www.jdocs.com/javase/7.b12/java/util/regex/Pattern.html (OpenJDK의 문서 여야 함). –

    1

    모든 정규 표현식을 검사하고 다시 검사한다는 개념에 관해서는 PHP와 Java 라이브러리가 어쨌든 구문에 대해 동의하는지 확인하십시오. 내가해야 할 일은 모두 테스트를 거쳐 몇 가지 테스트 (입력 및 출력)를 작성하고 두 구현에서 모두 동일하게 작동하는지 확인하는 것입니다. 그런 다음 자동으로 실행하는 방법을 고안하면 향후 업그레이드 및 비 호환성에 대해 다룰 것입니다. 당신은 여전히 ​​물건을 조정할 필요가 있지만 적어도 당신은 어디에 있는지 알 것입니다.

    +0

    글쎄, java.util.regex는 Perl5와 호환되어야하며,이 기능 외에도 도구에는 사용되지 않는 몇 가지 기능을 포함하지 않아야합니다. 필자는 PHP 원본의 저자에게 다른 구현을 인증 할 수있는 몇 가지 테스트를 작성하도록 요청했습니다. –