🖥

正規表現で忘れがちなこと ( 基本的な落とし穴 )

2023/08/26に公開

意外と正規表現の基本ではまる人が多いような気がしたので、書き記す。

ひとつずつは単純なケースだが、正規表現が長くなってくると、わりと考慮漏れを見かけることがある。

1文字以上マッチさせる場合はプラス + を使う

/\d/ 

これは数字1文字にしかマッチしない。
100 をマッチさせているつもりが先頭の 1 までしか見ていなかったりする。

「数字の連続」をマッチさせる場合は + を付ける。

/\d+/

これで数字の連続全体 ( たとえば 100 ) がマッチする。

「あってもなくても良い」場合

「あってもなくても良い場合」がアスタリスクで書かれている場合がたまにある。

/(SomeString)*/

これだと 0回以上のマッチなので、 SomeStringSomeStringSomeString とかにもマッチしてしまう。

/(SomeString)?/

であれば SomeString が「ある場合」と「ない場合」にマッチする。

上の例ではまったく意味はないが、次のような例だと違いが出る。

/This(SomeString)?IsOK/

この書き方だと ThisIsOKThisSomeStringIsOK の2パターンにマッチする。

行頭行末のマッチを忘れずに

ついつい忘れがち。

/SomeString/

これだと OooooooooooooooooSomeStringIsHeeeeeeeeeere! とかにもマッチしてしまう。

/^SomeString$/

厳密にマッチさせる場合は行頭・行末の考慮を忘れずに。

ブラケットの中は1文字分のパターンマッチ

/[abc]/

これは abc の1文字にマッチする。
abc という文字列にマッチするわけではない。

abc にマッチさせる場合はグルーピングを使う。

/(abc)/

可読性

省略記法は便利だが、可読性のためにはあえてマッチ文字を羅列した方が良いんじゃないかと思っている。

/[0-9]/

これは \d と等価。

/[a-zA-Z0-9_]/

これは \w と等価。

チャットメンバー募集

何か質問、悩み事、相談などあればLINEオープンチャットもご利用ください。

https://line.me/ti/g2/eEPltQ6Tzh3pYAZV8JXKZqc7PJ6L0rpm573dcQ

Twitter

https://twitter.com/YumaInaura

公開日時

2018-08-03

Discussion