エンジニアのひよこ_level10

【毎日更新!】新卒3年目エンジニアブログです!

【正規表現】()内で `?:`使って、preg_matchなどの検索結果に含めない【690日目】

グルーピングに使う()で不便なこと

正規表現を書くときに、

/(aaa)([0-9])(aaa)/

このように、ひとつのまとまりを表現するために、 ()を使うときがあります。

しかしこのとき、結果を \1などで選択するときには、 ()の数を数えて、何番目かを確かめないといけないです。

今回だと、2番目・・・みたいに考えるのは面倒。(aaa)とか数える順番から除外したい。

php > $text = "aaa2aaa3aaa";
php > preg_match("/(aaa)([0-9])(aaa)/", $text, $matches);
php > var_dump($matches);
array(4) {
  [0]=>
  string(7) "aaa2aaa"
  [1]=>
  string(3) "aaa"
  [2]=>
  string(1) "2"
  [3]=>
  string(3) "aaa"
}

これ嫌ですよね。

()内で?:を使う

php > preg_match("/(?:aaa)([0-9])(?:aaa)/", $text, $matches);
php > var_dump($matches);
array(2) {
  [0]=>
  string(7) "aaa2aaa"
  [1]=>
  string(1) "2"
}

?:を使ったときには順番から除外されていますね!

結構便利φ(・