ROBOT PAYMENT TECH-BLOG

株式会社ROBOT PAYMENTのテックブログです

正規表現の奥深さ

こんにちは、ROBOT PAYMENTの開発統括室ペイメントシステム課のtaniguchikun です。 正規表現を使用して文字列解析や置換を実装する事が多かったので、その辺についてお伝え出来ればと思います。 ※本記事にChatGPTは使用されておりません。筆者の熱い想いが綴られておりますw


対象文字列から14~16桁の数字のみを文字列から取得したいと思った際に、パッと頭に浮かぶのは以下のような正規表現になりますが読者の方々はいかがでしょうか?自分はそうでした。

解析文字列:   [0-9]{14,16}
対象文字列:  012345678901234567
マッチ文字列:   01234567891234

しかし上記の正規表現だと不十分で17桁以上の数字の時にもパターンマッチしてしまいます。

そこで以下のような正規表現で文字列を解析すると、対象文字列中の先頭から末尾までの間に出てきても14~16桁の数字だけを抽出する事が出来ます。

(?<![0-9])[0-9]{14,16}(?=([^0-9]|$))

上記のように単純に14~16桁の連続した数字を取得は簡単そうに見えて案外テクニックが必要だったりします。

肯定先読み否定先読みの解説

使いどころとしては検索対象文字列が含まれた行の抽出に役立ちます。

下記が肯定先読みと言われるものになります。

パターン:  Robot(?=Payment)
解析文字列:  RobotPayment
マッチ文字列:   Robot

パターン: (?=RobotPayment)Robot
解析文字列:  RobotPayment
マッチ文字列:   Robot

下記が否定先読みと言われるものになります。

パターン:  Robot(?!SubScription)
解析文字列:  RobotPayment
マッチ文字列:   Robot

パターン:(?!RobotSubScription)Robot
解析文字列:RobotPayment
マッチ文字列:Robot

肯定後読み否定後読みの解説

使いどころとしては肯定先読みや否定先読みと大して変わりないです。

下記が肯定後読みと言われるものになります。

パターン:  (?<=Robot)Payment
解析文字列:  RobotPayment
マッチ文字列:   Payment

下記が否定後読みと言われるものになります。

パターン:  (?<!SubScription)Payment
解析文字列:  RobotPayment
マッチ文字列:   Payment

最後によく使う基礎的な部分を解説したいと思います。

ここからは繰り返しパターンについて触れていきたいと思います。

*    直前のパターンが0回以上連続
+   直前のパターンが1回以上連続
?   直前のパターンが0回か1回
{N} 直前のパターンがN回の連続
{N,}    直前のパターンがN回以上の連続
{,M}    直前のパターンがM回以下の連続
{N,M}   直前のパターンがN回からM回の連続

ここからは文字クラスについて触れていきたいと思います。

[abc]    カッコ内の文字(a,b,c)のうち、いずれかの一文字だけ
[a-z]   a,b,c,d,...z のいずれか。([a-zA-Z]で大文字も比較対象になります)
[^abc]  カッコ内の文字(a,b,c)以外の一文字だけ

ここからはアンカーについて触れていきたいと思います。

^    テキストの開始位置
$   テキストの終了位置

総括

正規表現がマスター出来れば、どんな文字列操作も怖くなくなるでしょう。 ここまで読んでいただけたとするとマスターまで後2,3歩程になっていると思います。 正規表現を利用して快適な文字列操作を!



We are hiring!!

ROBOT PAYMENTでは一緒に働く仲間を募集しています!!!

speakerdeck.com
www.robotpayment.co.jp
🎉twitter採用担当アカウント開設!🎉どんどん情報発信します!!