ブログに戻る

公開日 · 読了時間 1 分

非エンジニアのための正規表現: 実用ガイド

ライター、アナリスト、マーケター、検索置換に住むあらゆる人向けの、専門用語を抑えたフレンドリーな正規表現チュートリアル。重要な文法を学び、すぐに使える10個のレシピを手に入れましょう。

なぜ非エンジニアが正規表現を気にすべきか

Word、Googleドキュメント、Notion、スプレッドシート、好みのテキストエディタの「検索と置換」ボックスを開き、「もっと速い方法があるはず」と思ったことがあるなら、あなたはこのガイドにぴったりの読者です。正規表現(regex)は小さなパターン言語で、検索と置換を鈍器から精密ナイフに変えます。固定された単一の単語を検索する代わりに、探しているものの形を記述します: 「あらゆる電話番号」「日付で始まるすべての行」「この乱雑なエクスポート内のすべてのメールアドレス」。

正規表現は威圧的な評判がありますが、それは主にエンジニア向けに書かれたチュートリアルが最初の段落で20個の記号を投げてくるからです。実際には約10個の文字とひと握りのパターンで、驚くほど生産的になれます。本記事ではその中核をたどり、ほぼあらゆる現代アプリの「検索と置換」ボックスに今日落とし込める10個のコピペレシピを渡します。

regexがどこで動くかについての注意: Microsoft Word(「ワイルドカードを使用」または新しいregex検索経由)、Googleドキュメント(「正規表現を使用してマッチ」)、Notion(限定的)、VS Code、Sublime Text、BBEdit、Obsidian、Googleシート(REGEXMATCHとREGEXREPLACE経由)、ExcelはPower Queryと新しいREGEX関数経由、そしてほぼすべてのコードエディタとオンラインテストツールでサポートされます。アプリによって少し方言が異なりますが、ここで学ぶ90%はどこでも動きます。

そもそも正規表現とは?

正規表現はパターンです。検索エンジンにパターンを渡すと、そのパターンにマッチするテキストの塊をすべて返します。最も単純な正規表現は字面の単語です。パターンcatはc、a、tの順の文字列を見つけます。ここまでは普通の検索置換と同じで退屈です。

魔法はメタ文字と呼ばれる特殊文字を混ぜると始まります。これらは自分自身にマッチしません。カテゴリーやルールを記述します。例えばドットは「任意の1文字」を意味します。パターンc.tはcat、cot、cut、c5t、c#tにマッチします。突然1つのパターンが何十もの検索の仕事をします。

それがメンタルモデルのすべてです。正規表現は字面のテキストですが、一部の文字がより一般的な意味に格上げされています。これらの格上げされた文字が何をするかを学べば、出会うほぼすべてのパターンを読み書きできます。

覚えておく価値のある構成要素

  • . (ドット) は改行を除く任意の1文字にマッチ。
  • * は「直前のものの0回以上」。a* は空文字列、a、aa、aaa などにマッチ。
  • + は「直前のものの1回以上」。a+ は a、aa、aaa にマッチするが空文字列にはマッチしない。
  • ? は「0または1」、つまり任意。colou?r は color と colour の両方にマッチ。
  • ^ はパターンを行頭にアンカー。^Hello は行頭の Hello のみを見つける。
  • $ は行末にアンカー。\.$ はピリオドで終わるすべての行を見つける。
  • [abc] は文字クラス。a、b、c のいずれか1文字にマッチ。[a-z] は任意の小文字、[0-9] は任意の数字、[A-Za-z0-9] は任意の文字または数字。
  • [^abc] のように括弧内にキャレットを置くと「a、b、c 以外の任意の文字」を意味する。
  • \d は任意の数字、\w は任意の単語文字(文字、数字、アンダースコア)、\s は任意の空白(スペース、タブ、改行)の省略形。大文字版 \D、\W、\S は反対の意味。
  • ( ) はグループを作り、複数文字に量指定子を適用したり、置換で再利用したいテキストをキャプチャしたりするのに使う。
  • パイプ | は OR。cat|dog は cat か dog にマッチ。
  • バックスラッシュ \ は特殊文字をエスケープして字面でマッチさせる。実際のドットを見つけるなら \.、字面の括弧なら \(。

アンカー、量指定子、貪欲の罠

アンカー(^と$)は精密なパターンを書く秘訣です。それなしでは、regexはテキスト内のどこにでも浮き、意図したより多くにマッチする傾向があります。それありなら、パターンを行頭か行末に固定でき、それは「数字で始まるすべての行」と言うときの意図そのものです。

量指定子(*、+、?、{2,4}のような中括弧形式)は、直前のものが何回繰り返されるかを制御します。知っておくべきことは、デフォルトで貪欲なことです: 取れるだけ取ります。<.+>と書いて<b>hi</b>に対して走らせると、<b>と</b>を別々にマッチさせると思うかもしれません。実際には<b>hi</b>全体を1度にマッチさせます。+が貪欲だからです。クエスチョンマークを加えて<.+?>とすると、量指定子は怠惰になり、可能な限り少なくマッチします。この単一のトリックは膨大なデバッグ時間を節約します。

検索置換のためのグループとバックリファレンス

括弧は二重の役割を果たします。第一に、塊を量指定できる: (ab)+はab、abab、abababにマッチします。第二に、はるかに有用なこととして、置換フィールドで参照できる番号付きスロットにマッチしたものをキャプチャします。最初の括弧は多くのエディタで$1(または\1)、2番目は$2、と続きます。

これがテキストを並べ替える方法です。スプレッドシートに名前が「姓, 名」と書かれていて「名 姓」にしたいとします。([A-Za-z]+), ([A-Za-z]+)を検索し、$2 $1で置換します。完了、何千行に対しても一発で。本記事の以降のレシピのほぼすべてが同じトリックを使うので、慣れておく価値があります: 左に括弧、右にドル番号。

レシピ1: 乱雑なテキストからすべてのメールアドレスを抽出

メールアドレスはエクスポート、署名ブロック、CRMダンプによく現れます。このパターンは妥当なデフォルトです。RFC完全準拠ではありません(どんなregexもそうではない)が、通常の文書のあらゆる現実的なアドレスを捕まえます。

[\w.+-]+@[\w-]+\.[\w.-]+

レシピ2: 一般的な書式の電話番号を見つける

電話番号はregexが乱雑な入力を飼いならす素晴らしい例です。下のパターンは555-123-4567、(555) 123 4567、+1 555.123.4567など、ほとんどのバリアントを捕まえます。ローカル番号だけが必要なら先頭の+と国番号を調整してください。

\+?\d{1,3}?[\s.-]?\(?\d{2,4}\)?[\s.-]?\d{3,4}[\s.-]?\d{3,4}

レシピ3: 日付書式を YYYY-MM-DD から DD/MM/YYYY に変える

これは古典的なグループとバックリファレンスの動きです。各日付部分をキャプチャし、置換フィールドで並べ替えます。検索ボックスに下のパターンを貼り、置換ボックスに $3/$2/$1 を貼ります。

(\d{4})-(\d{2})-(\d{2})

レシピ4: 文書からすべての空行を取り除く

長くペーストしたテキストにはページ数を倍や3倍にする余分な空行がよく付いてきます。下のパターンは任意の空白と改行のみを含む行にマッチします。空で置換すれば(置換ボックスを空のままに)、文書が単一行間隔に潰れます。

^\s*\n

レシピ5: 二重・三重・暴走のスペースを1つに潰す

OCRエクスポート、コピーしたPDF、古いWord文書は、単語間に二重スペースを撒くことで悪名高いです。連続する2つ以上のスペースを見つけて単一スペースで置換してください。

 {2,}

レシピ6: テキストブロックからすべてのURLを抜き出す

記事、メールエクスポート、チャットログからすべてのリンクを取りたい? このパターンはパスとクエリ文字列を含むhttpとhttpsのURLを捕まえます。エディタの「すべての一致をコピー」機能と組み合わせるか、新しい文書にキャプチャ済みマッチを貼り付けてください。

https?://[\w.-]+(?:/[\w./?=&%#-]*)?

レシピ7: リスト内の各名前の最初の文字を大文字にする

小文字でタイプされた名前(jane doe、mark twain)の列があるなら、2パスでケースを直せます。まず下のパターンを見つけ、各単語の最初の文字をキャプチャします。多くのエディタでは \u$1(最初のキャプチャを大文字化)で置換できます。あなたのエディタが対応していなければ、専用のケースコンバーターを通してください。Multilitiesはワンクリックで処理する小さなcase-converterを提供しています。

\b([a-z])

レシピ8: 数字を含む行だけを残す

regexにマッチしないすべての行を削除できるエディタもあります。下のパターンと組み合わせれば、長いログファイルやノート文書を数字を含む行だけに絞り込めます。PDFから貼り付けた銀行明細の整理に素晴らしく便利です。

^.*\d+.*$

レシピ9: 各行末の空白を標準化する

末尾の空白は見えませんが、差分ツール、メール署名、コードコメントを壊します。それらを見つけて空で置換してください。パターンは行末の直前にある1つ以上のスペースまたはタブにマッチします。

[ \t]+$

レシピ10: ソーシャルメディアのエクスポートからハッシュタグを抽出

マーケティングチームがツイート、LinkedInの投稿、Instagramのキャプションをエクスポートし、どのハッシュタグが現れたかを数えたい。下のパターンは#の直後に1つ以上の単語文字が続くものを見つけ、周囲の句読点を引きずらずに、あらゆる現実的なハッシュタグを捕まえます。

#\w+

実際にツールで試す方法

Googleドキュメントでは、編集 → 検索と置換を開き、「正規表現を使用してマッチ」にチェックを入れます。Microsoft Wordでは、検索と置換ダイアログを開き、展開して「ワイルドカードを使用」にチェックを入れます(Wordのワイルドカード方言は似ていますが同一ではないので、上記パターンには微調整が必要なことがあります)。Notionでは、一部のデータベースプロパティと連携経由でregexがサポートされますが、検索バー自体は字面です。

Googleシートでは、パターンをREGEXMATCH、REGEXEXTRACT、REGEXREPLACEで包みます: =REGEXEXTRACT(A2, "[\w.+-]+@[\w-]+\.[\w.-]+")はセルA2からメールを抜き出します。Excelの新しいREGEXEXTRACT、REGEXREPLACE、REGEXTEST関数は同様に動きます。VS Code、Sublime、ほとんどのコードエディタでは検索バーの.*アイコンをクリックしてregexモードに切り替えます。

パターンが思うように動かないとき、じっと見つめないでください。タイプしながらマッチをハイライトするregexテスターに落とし込んでください。Multilitiesはまさにこのために無料の/tools/regex-testerを提供し、また/tools/find-replaceツールは元の文書に触れずに貼り付けたテキストブロックに対してパターンを実行します。テスターでイテレートするのは数秒、Word内でUndoを使ってイテレートするのは数分かかります。

よくあるミスと回避方法

  • ドットのエスケープを忘れる。字面のピリオド(ドメイン名、ファイル拡張子、文末)が欲しいなら \. と書く。素のドットは何にでもマッチする。
  • \S+ や [^,]+ を意味するときに .* を使う。ドットスター・パターンは貪欲で、特にカンマ、引用符、HTMLタグをまたいで意図以上に食う。
  • ^ と $ でアンカーするが、ツールによって ^ と $ が行ごとか文書ごとかが違うのを忘れる。意外なマッチが出たら、エディタに「マルチライン」「ドットオール」のトグルがあるか確認。
  • 方言を混ぜる。JavaScript、Python、PCRE、Wordのワイルドカード、POSIX regexは大半の文法を共有しますが、ルックアラウンドや名前付きグループのようなエッジケースで異なります。あるアプリで動かなくなったら、たいてい方言が原因です。
  • 置換のために括弧を使わない。マッチした一部を残したいなら、キャプチャする必要があります。括弧なしでは $1 や \1 で何も参照できません。

速くなる短いワークフロー

文書を整理する必要があるとき、完璧なregexを書くことから始めないでください。乱雑なテキストの2~3行のサンプルを選んでregexテスターに貼り付けることから始めます。1つの例の字面版をタイプし、塊ごとに1つずつアップグレードします: 数字を \d+ に、可変の名前を \w+ に、変動が許される句読点を文字クラスに置き換えます。各アップグレード後、テストテキストがまだマッチし、欲しくないものを捕まえ始めていないかを確認してください。

パターンが正しくなったら、本物の文書の検索ボックスにコピーし、1回置換を実行して同じ動作をするか確認してください。文書が重要なら、コピーで作業しUndoを積極的に使ってください。これを2~3回やる週には、よく行うクリーンアップ用のパターンを記憶から書き始めるようになり、乱雑なエクスポートに対して最初に手を伸ばすのは手作業のクリックではなく、すべてを一気にこなす小さなパターンになります。

ここから先

上記のパターンとレシピは、日常のテキストクリーニング、抽出、再フォーマットの圧倒的多数をカバーします。さらに深く行く準備ができたら、ルックアヘッド((?=...))、ルックビハインド((?<=...))、非キャプチャグループ((?:...))、名前付きキャプチャ((?<year>\d{4}))を調べてください。日常作業に必須ではありませんが、本当に難しいテキストに出会ったときにより優雅なパターンを解錠します。

regexは他のどんな技術スキルよりも、短く頻繁な練習が報われます。最もよく使う5つのレシピを書き留めたメモファイルを保ち、新しいものを見つけたら貼り付けていくと、数か月で「スプレッドシートが乱雑になったときに皆が頼る人」になります。それは驚くほど居心地のよい場所です。

これらのツールを試す