時間がない中で急に修正依頼が来た。対応したいけれど、どのくらいのボリュームがあるか把握するのも大変……

まさに、このような「作業時間が間に合いそうにない!」という時に、皆さんはどのように対処していますか。

対応方法は色々ありますが、効率よく、ミスのない方法で進めたい方にオススメなのが「正規表現」です。利用することで作業を効率化することができる便利なものですが、耳にしたことはあるけれど「使い方がわからない」「難しそう」と感じている方も多いのではないでしょうか。

そこで今回は、否定の表現を中心に正規表現の利用方法を簡単にご紹介します。

一通りご覧いただければ、正規表現を利用できるようになります。興味のある方はぜひ記事を参考にしていただき、早速活用してみてください。
  

正規表現とは

正規表現(Regular Expression)とは、特定の文字列をパターン化して記号で表現する手法のことで、テキストエディタ、プログラミング言語などを扱う際に利用できます。

通常の文字 (a~zなど) に加えて、メタキャラクタと呼ばれる特殊な記号を用意しており、これらを組み合わせることで文字列を指定することが可能です。メタキャラクタの例を挙げると、「+」……直前の文字の1回以上の繰り返し、「.」……任意の1文字、などがあります。

正規表現は、例えば「文字列の中で特定の文字列を検索・置換したい時」や「ある文字列が何行目にあるか検索したい時」などに活躍します。

参考:
便利な正規表現 | Shinta's Site
  

特定の文字を含まない記述

正規表現には「文字クラス」という、ある文字列が含まれるとマッチングするという記法があり、これを使うことで”特定の文字を含まない”表現をすることができます。必要な部分だけを抜き出したい、〜ではない部分を探したい、というケースで多用する条件ですので、覚えておいて損はありません。

文字クラスの否定を表すには、「^(キャレット、カレット)」を使います。

参考:
正規表現:文字やパターンを「含まない」、否定の表現まとめ | WWWクリエイターズ
  

例1. 特定のアルファベットではない文字

文字クラス(character class)内 [ ] でマイナスハイフン「-」を使うと、範囲を指定することができます。例えば、[a-z]ならば「小文字のa〜zまで」、[A-C]なら「A〜Cまで」を表します。

ここに「^(キャレット、カレット、caret)」を使うと、特定のアルファベットではない1文字を表現することができます。[^マッチさせたくない文字]という形で、「^(キャレット、カレット)」以降にマッチさせたくない文字列を記述します。

● 例:

[^a-z] → 「小文字のa〜zまで」以外の1文字にマッチする
[^A-C] →  「A〜Cまで」以外の1文字にマッチする

  

例2. スペース以外の文字

上記では、ある特定アルファベットではない文字をマッチさせたい場合の例をご紹介しました。

では、スペース以外の文字を表現したい場合にはどうすればいいでしょうか。この場合「^(キャレット、カレット)」に加えて、量指定子を使うことでスペース以外の文字をマッチすることが可能です。正規表現においては、+や*といった記号を量指定子といい、マッチする回数が異なります。

それぞれの記号の意味は以下のとおりです。

● 正規表現の量指定子

 * → 0回以上の繰り返しにマッチする
+  → 1回以上の繰り返しにマッチする
{a} →  a回の繰り返しにマッチする
{a,} →  a回以上の繰り返しにマッチする
{a,b} → a回以上b回以下の繰り返しにマッチする
?  → 0回または1回の出現にマッチする

例:
[^ ]+ → 全角スペースを含まない文字列
[^ ]+ → 半角スペースを含まない文字列
[^ | ]+ → 全角もしくは半角化のスペースを含まない文字列

  

例3. 空白文字を含まない表現

正規表現における空白文字とは「半角スペース・タブ文字・改行・改ページ」のことです。「\s」は空白文字(半角スペース・タブ文字・改行・改ページ全て)、「\S」は非空白文字(空白文字ではない)を表します。ここで注意すべきなのが、空白文字「\s」に全角スペースは含まれないことです。

例として、以下のような使い方ができます。

● 例:

\S+ → 空白以外の文字にマッチする

※ちなみに、「(\s| )」のように記述すると、空白文字と全角スペースにマッチさせることができます。
  

特定のパターンを含まない記述

先程ご紹介した文字クラスを利用する場合1文字単位での表現しかできませんでしたが、パターンを含まない文字列という形の表現も可能です。

ここからは、特定のパターンを含まない記述をご紹介します。

「文字列パターンの否定」を表現する「否定的先読み」では「?!」から始まる正規表現を「括弧 ( )」で囲むように記述することで、条件に合ったマッチングができます。

例:
?! ここに条件を記述する

範囲を指定するため「^」「$」で囲みます。
^ → 行頭を表す
$ → 行尾を表す

「abc」を含まない行にマッチ
例:^(?!.abc).$
「abc」もしくは「xyz」を含まない行にマッチ
例:^(?!.(abc|xyz)).$

それではさっそく「否定的先読み」の記述の具体例を見てみましょう。

参考:
正規表現:文字やパターンを「含まない」、否定の表現まとめ | WWWクリエイターズ
正規表現で文字列を含まない、否定の記述 | UX MILK
【正規表現】文字列の否定、ある文字列を含まない : nymemo
  

例1. 〜という文字列で始まらない

ある文字列で始まらない文字列にマッチしたいときの表現方法です。ここでは「今日の天気は晴れです。」という文章を例にして考えます。

例1:「天気は」で始まらない1行にマッチ
^(?!天気は).+$

「^」が行頭、「.」が改行以外の任意の1文字に一致しますので、例のケースでは「天気は」ではない行頭、改行以外の任意文字の1回以上の連続に一致します。

例2:「天気は」で始まらない文字列にマッチ
(?!天気).+$

例1と似ていますが、例2には行頭「^」がなく”行頭のすぐ後”という条件がないため「晴れです。」にマッチします。
  

例2. 〜という文字列を含まない

例1のケースでは開始位置を指定しましたが、次は単に「〜という文字列を含まない」場合の表現方法をご紹介します。

例:「晴れ」を含まない文字列
^(?!.晴れ).$

量指定子「 *」は、0回以上の繰り返しにマッチする記号です。上記のように記述することにより、「晴れ」を含まない文字列といった表現ができます。
  

まとめ

以上、知っておきたい!利用できる文字列の正規表現をご紹介しました。いかがでしたでしょうか。

きっと正規表現を今まで使ったことがない方でも、理解が深まったはずです。

業務を進めるにあたり必ず出くわす可能性がある「修正」ですが、該当箇所が多く作業が膨大な場合、1つひとつ人力で修正するのは作業時間がかかり大変です。また、時間の問題だけではなく、手作業という性質上どうしてもミスのリスクがあります。

そこで活用したいのが「正規表現」です。正規表現を作業に取り入れることで、単純作業に使う時間を省くことができ、時間をかけるべき作業に注力できるようになります。また、検索を行うことで該当箇所のボリュームがどのくらいあるのかを把握することも可能です。

もちろん、修正以外にも様々なシーンで役に立ちます。記号を使うこともあり、非エンジニアの方の場合難解なイメージを持ってしまいがちですが、少しずつ利用していけば徐々に慣れてくるのではないでしょうか。

色々な応用方法がありますので、業務効率をアップしたい方はぜひ取り入れてみてください。