코어 분석중에 (?: 과 같은 패턴이 나와서 관련 내용을 찾아서 읽어봤습니다.

      https://secure.php.net/manual/en/regexp.reference.subpatterns.php

내용을 보면,

           For example, if the string "the red king" is matched against the pattern the ((red|white) (king|queen)) the captured substrings are "red king", "red", and "king", and are numbered 1, 2, and 3.

  ....

 For example, if the string "the white queen" is matched against the pattern the ((?:red|white) (king|queen)) the captured substrings are "white queen" and "queen", and are numbered 1 and 2.

 

이렇게 나와있었습니다. 그런데 여기서 좀 의아했던게, 저렇게 ((red|white) (king|queen)) 이라면

red king만 매치가 돼야 하는게 아닌가라는 생각이 들었습니다. red와 white 중 하나, king과 queen중 하나가 존재하는 문자열만 매칭시켜야 하는것 아닌가 라는 생각이 들어서였는데, regexr.com 에서 테스트한 결과도 그렇더군요. 그래서 결론 내리기를 php에서 특수하게 인정하는 패턴인가 보다.. 했습니다.

근데 혼자 결론내리기가 좀 찝찝해서 다른 분들의 의견을 좀 듣고 싶었습니다. 회원님들의 지식 공유 부탁드립니다ㅎ

  • profile
    기진곰 2016.09.04 13:47:48

    정규식을 쓸 때 괄호로 묶은 부분은 모조리 $matches로 반환하고, 이중으로 괄호를 쓰면 이중으로 반환이 됩니다. 그러나 괄호 안에 ?:를 쓰면 그 부분은 반환하지 않습니다. 불필요한 데이터를 반환하지 않도록 하면 성능도 좋아지고 프로그래밍하기도 편해지거든요. 그 밖의 차이는 없어요. 정규식 작동 방식에도 아무 영향을 미치지 않습니다.

     

    그래서 위의 예제에서는 red king, red, king을 모두 각각 반환하지만 아래에서는 red|white 부분에 ?:를 붙였기 때문에 white는 별도로 반환하지 않고 white queen과 queen만 반환합니다. red나 white나 둘 중 아무거나 하나만 있으면 됐지, 실제로 red인지 white인지는 알 필요가 없다! 이런 경우에 쓰는 겁니다.

  • ?
    갸라 2016.09.04 13:55:45
    아.. 언제나 명확하십니다. 감사합니다!
  • profile
    구름이 2016.09.04 16:15:14
    감사합니다 또 하나 배워갑니다
  • ?
    갸라 2016.09.08 15:09:19
    넵ㅎ :)

서버에 요청 중입니다. 잠시만 기다려 주십시오...