こんにちは。エンジニアの草野です。
今回は業務上個人的によく利用している正規表現について、簡単な説明を挟みながらご紹介していこうと思います!
1. はじめに
正規表現とは、特定のパターンにマッチする文字列かどうかを判定するために利用する表現方法となります。
w2の業務上では開発時にも使いますが、私の場合は各種ログの調査やクエリ作成時の一括置換などによく利用しています。
今回はこれらのよく使う正規表現について一部ご紹介します。
2. 特定の文字列を含む行の抽出
おそらくもっともよく利用している正規表現がこちらとなります。
^.*検索文字列.*\r\n
まずは簡単にこちらで利用されている正規表現について説明します。
^ | 行の先頭を表す表現です。 |
. | 見づらいですが、ドットです。 こちらは任意の1文字、を表す表現です。 |
* | 繰り返しを表す正規表現です。 直前の文字が存在しない、または直前の文字が1個以上連続する場合にヒットする正規表現となります。 |
\r\n | 改行を表す表現です。 |
上記から、今回の正規表現を文章にすると、
先頭から任意の文字が0文字以上続く
かつ
途中で「検索文字列」という文字列がある
かつ
その後も改行が現れるまで任意の文字が0文字以上続く行
と、なります(わかりづらくて申し訳ありません…)。
この正規表現を利用することで任意の文字列を含む行を抽出することが可能です。
※文章だとわかりづらい場合は下記サイトなどで正規表現を視覚化するとわかりやすいです!
https://regexper.com/
これだけだと単純に文字列を検索するだけでもある程度代用できてしまいますが、これと置換を組み合わせると調査時に便利です。
具体的には下記のように置換処理を行います。
○検索文字列
^.*検索文字列.*\r\n
○置換文字列
空
このように置換をすることで特定の文言を含む行のみを削除し、さらに削除した行は詰めることが可能です。
ログ解析時などに不要な行を削除するのに多用する置換処理なので、是非ご活用ください!
3. 特定の文字列を含まない行の抽出
特定の文字列を含む行だけを抽出する方法を説明しましたが、今度は特定の文字列を含まない行の抽出方法について説明します。
^(?!.*検索文字列).*\r\n
前回は出てこなかった正規表現があるので、まずはそちらの説明からします。
(…) | 括弧で囲った範囲を1つのグループとして扱うことができる表現です。 今回は後述する否定的先読みの範囲指定のために利用しています |
?! | 否定的先読み、と呼ばれる表現です。 ?!以降に記載されているパターンにマッチしない場合にヒットさせることができる表現です。 ※肯定的先読みという逆の表現もあるので興味があれば調べてみて下さい! |
上記から、今回の正規表現を文章にすると、
「任意の文字0文字以上+検索文字列」という文字列が存在しない
かつ
改行が現れるまで任意の文字が0文字以上続く行
と、なります(またまたわかりづらくすみません…)。
この正規表現を利用することで、任意の文字列を含まない行のみ抽出が可能です。
※文章でわかりづらい場合は下記サイトなどで正規表現を視覚化するとわかりやすいです!
https://regexper.com/
おそらく予想できるかと思いますが、こちらも置換処理と組み合わせての利用をよく行います。
○検索文字列
^(?!.*検索文字列).*\r\n
○置換文字列
空
このように置換をすることで特定の文言を含む行のみを残して削除し、さらに削除した行は詰めることが可能です。
ログ解析時などに特定の文言を含む行のみ残すために多用しています。
4. おわりに
まずはログ解析時によく利用している正規表現についてご紹介させていただきました。
次回はクエリ作成に利用している正規表現について紹介しようかと思います。
正規表現が使いこなせるようになると分析や文字列整形の工数を大きく削減できるので、皆さんも是非使ってみてください!
コメント