2012-11-17 4 views
0

Pattern 클래스에는 정규식의 두 가지 유형이 있습니다 : 캡쳐비 캡쳐이지만 차이점을 이해하지 못합니다.캡처 패턴과 캡처하지 않는 패턴의 차이점은 무엇입니까?

http://docs.oracle.com/javase/6/docs/api/java/util/regex/Pattern.html#special

그들은 어떻게 다른가? 언제 각각 하나씩 사용해야합니까? 어떤예요?

+0

역 참조를 사용하면 캡처 된 이미지를 참조 할 수 있습니다. –

답변

3

한 위치에서 여러 가지 항목을 확인해야하는 패턴 (예 : 다른 두 개의 문자 패턴)을 고려해보십시오.

/(ab|cd|ef)/ 

뿐만 아니라 () 브래킷의 사용을 필요로 : 일반적으로 당신은 | 교대 연산자를 사용합니다. 그러나 그 괄호는 또한 캡쳐 그룹의 역할을합니다. 아마 당신은 정말, 그 문자 시퀀스를 캡처 비 캡처 그룹이 역할을하는 곳 그냥 자신의 존재를 확인하고 싶지 않은 :

/(?:ab|cd|ef)/ 
+1

어쩌면 나는이 질문을 이해하지 못한다. 그러나 나는 이것이 어떻게 설명 하는지를 고심한다. 나에게 그것은 "당신이 캡처하고 싶을 때 정규 표현식을 사용합니다 ..."와 같이 읽습니다. * 캡쳐 * 그룹 *이 무엇인지 아는 것이 문제가되지 않는다면, "아이팟은 언제 사용합니까?" – phant0m

2

당신은 할 수 있습니다 표현 독립적으로 을의 그룹 캡처 뭔가. 예를 들어 :

abc(foo|bar)def 

는 "abdfoodef"또는 "abcbardef"하지만 다른 변화 중 하나와 일치 할 경우,이 간단한 표현이다. 두 개의 표현식을 그룹화하여 을 사용하려면 ()을 사용해야했습니다. 그러나 이는 또한 (foo|bar)이 첫 번째 캡처 그룹임을 의미합니다. 당신이 원하는 또는 캡처가 필요하지 않은 경우

가하는 비 캡처 그룹로 쓰기 :

abc(?:foo|bar)def 
0

캡처/비 캡처는 전체 정규식을 참조하지 않고, 그룹, 예 : 괄호 안의 표현.

  • 사용 역 참조 하시겠습니까?
  • 검색 전체 특정 부분을 검색 하시겠습니까? (또는 다중)

경우에, 당신은 캡처 그룹을 원할 것입니다.

하지경우에, 당신은 우선 순위 제어 괄호를 사용하고 그룹 이외의 캡처를 할 수 있습니다.

1

캡쳐 그룹을 사용하면 정규식 일치 항목의 일부를 다시 사용할 수 있습니다.당신은 대체 성명에서, 예를 들어 나중에 정규 표현식 내에서 재사용하거나 할 수 있습니다 1a2b3cdef7g9h 이 정규식 :

이 텍스트를 고려 ([0-9] *) ([AZ] *) 두 캡처있다 그룹은 첫 번째 문자 시퀀스를 캡처하고 두 번째 문자 시퀀스를 캡처합니다.

replaceAll 문을 사용하면 첫 번째 캡처 그룹 ($ 1)을 사용하여 숫자를 유지하거나 두 번째 문자 ($ 2)와 문자를 유지할 수 있습니다.

// next line outputs : 12379 
    System.out.println("1a2b3cdef7g9h".replaceAll("([0-9]*)([a-z]*)", "$1")); 

    // next line outputs : abcdefgh 
    System.out.println("1a2b3cdef7g9h".replaceAll("([0-9]*)([a-z]*)", "$2")); 

하지만 추가하여 (예를 들어 비 캡처 그룹을 사용하는 경우 : 그것은 캡처하지 않는, 예를 들면 그래서 가끔 유용입니다 :

// next line outputs : abcdefgh 
    // ([a-z]*) becomes the first capturing group because (?:[0-9]*) is a non-capturing group 
    System.out.println("1a2b3cdef7g9h".replaceAll("(?:[0-9]*)([a-z]*)", "$1")); 

는 상기 http://gskinner.com/RegExr 에보십시오. 당신의 캡처 그룹은 당신이 볼 수있는 화면의 하단 곳

참조 : http://www.regular-expressions.info/brackets.html

1

그냥 생각 나는 나를해야 당신은 또한과 같이 캡처 그룹 이름을 만들 수 있습니다 ntion :

(?<telephone>(?:\(\d{2}\)\s\d{4}\s\d{4})) 

(02) 9502 5697

같은 전화 번호를 일치합니다 당신은 다음과 같이 역 참조로 사용할 수 있습니다

"s/(?<telephone>(?:\(\d{2}\)\s\d{4}\s\d{4}))/\k<telephone>/g" 

어떤 그 경기 자체를 대체 하겠지만 ... 당신은 그걸로 창조적이 될 수 있습니다.

희망이 도움이됩니다.

관련 문제