HapInS Developers Blog

HapInSが提供するエンジニアリングの情報サイト

最近活かせた正規表現のおはなし


HapInSアドベントカレンダー2023、22日目!
こんにちわ!
趣味で殺伐としたアニメや映画を観ることが多かったですが

葬送のフリーレンに最近は癒されてます。高杉です。

 

最近業務にて電文等修正でテキスト検索や置換を行う事が多く、
正規表現に助けられたなと感じる機会が改めて増えてきましたので、

個人的にではありますが「役に立った!」と思う正規表現の組合せをいくつか紹介できればなと思います。

 

◆はじめに


いまさらなおさらいかと思いますが
正規表現とはテキストデータの柔軟な操作を可能にするための記法で、
プログラムのパターンマッチングやデータ整形や検索置換等様々な場面や環境で使われています。

また、多くの一般的なエディターにはサポートがあるため多くの場面で気軽に使えるのも魅力のひとつです。


◆便利だった正規表現の組合せ

今回は現場で検索置換を行う際にわりと重宝した正規表現の組合せをいくつか紹介します。

 

形態の決まっている文字列(数列)の検索

下記のような数列の内、携帯番号のみをヒットさせたい...

080-9876-5432
03-1234-5678 
012-1aa3-456
0570-12-3456
080-111-2327
050-987-6xx3

 

【携帯番号とする判断条件】

・070~090で始まる。

・3桁-4桁-4桁の形態である。

・数字のみである。

 

このような場合は以下の正規表現で検索することができます。

検索値 :0[7-9]0-[0-9]{4}-[0-9]{4}

正規表現:[ ] ブラケット  "-"(ハイフン)を入れることで範囲指定をする

     {n} ブレース ・  その前に指定した文字がn文字続く

 

検索内容:はじめの3桁が070~090、

     "-"(ハイフン)

     真ん中の4桁は0~9の数字のみ4桁、

     "-"(ハイフン)、

     後ろの4桁は0~9の数字のみ4桁の文字列

 

フルパスからファイル名のみを検索

下記のようなフルパスの内、ファイル名だけ検索したい...

  1. C:\Users\YourUsername\Documents\SampleFile1.xlsx
  2. D:\Projects\Data\SampleFile2.xlsx
  3. E:\Work\Reports\SampleFile3.xlsx
  4. F:\Personal\Files\SampleFile4.xlsx
  5. G:\Shared\Excel\SampleFile5.xlsx
 

【ファイル名とする条件】

・最後の¥以降すべて

 

このような場合は以下の正規表現で検索することができます。

検索値 :.*\\

正規表現: .  ドット      任意の1文字

      *  アスタリスク   0回以上の任意の文字

      \  エスケープ文字  後に続く正規表現の意味をなくす

     \\  バックスラッシュ エスケープ文字により正規表現でなく文字として判断する

 

検索内容:最後のバックスラッシュから始まり、その前に任意の文字列が0回以上繰り返されている

 

金額表記を円から¥に置換

下記のような金額の部分をすべて「円」表記から「¥」表記に変えたい...

そのまま置換すると"1000円"が"1000¥"に置換されてしまう...

商品A: 3500円、送料別途 支払総額は5000円です。
本日の特売品! お得な価格 2000円
サービス利用料金 月額 1200円(税込)
チケット予約受付中 1枚 4800円(会員割引あり)
新製品発売記念セール! 特別価格 7500円6800円

【検索置換する際の条件と考慮】

・数字+円である。

・円を¥に置換する。

・置換後は金額の前に「¥」を置く。

 

このような場合は以下の正規表現で置換することができます。

検索値 :([0-9]+)円

正規表現:( ) カッコ    マッチした内容をキャプチャ(記録)する

     [ ] ブラケット  "-"(ハイフン)を入れることで範囲指定をする

     + プラス    あとに1文字以上文字がある

 

検索内容:数字の後に円がある場合にマッチし、マッチした際その数字を記憶する

 

置換値 :¥$1

正規表現:$1 ドル1    キャプチャ(記録)された値

 

置換内容:¥のあとにキャプチャ(記録)された数値に変換する

置換後

商品A: ¥3500、送料別途 支払総額は¥5000です。
本日の特売品! お得な価格 ¥2000
サービス利用料金 月額 ¥1200(税込)
チケット予約受付中 1枚 ¥4800(会員割引あり)
新製品発売記念セール! 特別価格 ¥7500¥6800

 

同一文言を含む文字列を無視した検索

下記の文字列の内、"usr"の項目名検索したい...

ただそのまま検索すると"usrGrp"や"usrEvnt99"までヒットしてしまう...

usr=alice
usr=bob
usr=charlie
usrGrp=Group1
usrGrp=Group2

usrEvnt99=aaa

usrEvnt99=bbb

 

【usrとする検索条件】

・usrに一致する。

・usr~~は対象外にする。

 

このような場合は以下の正規表現で置換することができます。

検索値 :usr(?![a-zA-Z0-9])

正規表現:(?= ) lookahead先読み 直後に囲んだ文字列がある場合にマッチする

     (?!  ) lookahead否定先読み

                直後に囲んだ文字列がない場合にマッチする 

     [ ] ブラケット  "-"(ハイフン)を入れることで範囲指定をする

 

検索内容:usrから始まり、その後に文字または数字を含むものは対象外とする

 

おわりに

慣れれば細かい条件でのマッチが可能となるため、

調査やデータの編集でとても役に立つと思います。

あまり触れる機会がなかった方も是非一度調べてみてください。

 

 

話は変わりますが、もうクリスマスが目前ですね!
素晴らしい週末となりますようお祈りしています。

メリークリスマス!
またのご縁を楽しみにしております。