2012-03-01 3 views
1

나는 텍스트 블록의 (반드시 반복되지 않음) 순서를 일치합니다 정규식, 예를 들어 쓰기를 시도하고있다 :실제 경기가 아닌 패턴을 참조하는

foo,bar,foo,bar

내 최초의 생각이었다을

(foo|bar)(,\1)*

같은 역 참조, 뭔가를 사용하지만이 정규식은 foo,foo 또는 bar,bar하지만일치하는지 밝혀하기또는 bar,foo (등등).

패턴의 일부를 참조하는 다른 방법이 있습니까?

현실 세계에서 foobar은 50 자 이상의 긴 정규 표현식이며 사본을 붙여 붙여 시퀀스를 정의하는 것을 피하기 만하면됩니다.

답변

3

괜찮은 정규식을 사용하면 (foo|bar)(?:,(?-1))* 등을 사용할 수 있습니다. 그러나 Java는 하위 패턴 호출을 지원하지 않습니다.

따라서 ajx의 대답과 같이 문자열 바꾸기/형식을 수행 할 것인지 선택해야하며 그렇지 않은 경우 언제 쉼표를 사용할 수 있는지 알 수 있습니다. 예 :

(?:(?:foo|bar)(?:,(?!$|\s)|))+ 
0

뒷쪽 참조의 요점은 패턴과 일치하는 실제 텍스트와 일치하는 것이므로 사용할 수 있는지 확실하지 않습니다. 로, 아마도 당신은 자바 비트하여 정규식 비트를 만들 수 (쉼표 다음에) foo는 나 바의 2 개 이상의 인스턴스

+0

제 문제는 정규식이 외부에서 정의되고 패턴이 정적으로 컴파일된다는 것입니다. 접근법이 가능할 수도 있지만, 마지막 쉼표 뒤에 쉼표가없고 다른 쉼표 사이에 쉼표가 있는지 확인하지 않습니다. – mindas

+0

나는 오해를하고 있을지 모르지만 변수에 외부 패턴을 가져 와서 패턴에 꽂을 수는 없습니다. 위의 편집 된 버전을 참조하십시오. –

+0

것은, 나 can not. 정의 된 정규 표현식에 따라 사물의 유효성을 검사하는 레거시 프레임 워크가 있고 다른 객체 유형에는 다른 정규 표현식이 할당되어 있습니다. 특정 유형의 데이터에만 특수 메커니즘을 사용하는 것은 용납 될 수 없습니다. 어쨌든 귀하의 의견을 보내 주셔서 감사합니다. – mindas

1

일치하는 것이다

String s= "foo,bar,foo,bar"; 
      String externalPattern = "(foo|bar)"; // comes from somewhere else 
      Pattern p = Pattern.compile(externalPattern+","+externalPattern+"*"); 
    Matcher m = p.matcher(s); 
    boolean b = m.find(); 

:

당신은 같은 한정사를 사용할 수 in :

두 번째 줄을 함수로 분해 할 수 있습니다. 이 함수는 서브 표현식을 취해 쉼표로 구분 된 서브 표현식 목록과 일치하는 전체 정규식을 반환합니다.

+0

나는 그것을 정말로 할 수 없다. (Matt의 대답에 대한 나의 의견을 보라). 그러나 이와 같은 패턴 부분을 참조 할 수있는 명확한 방법이 없다면, 나는 그 부분과 함께 살 것입니다. – mindas

관련 문제