この記事では個人的によく使う正規表現のメモをまとめていきます。実用レシピとして少しづつ追加します。
テキストエディタの秀丸、Googleスプレッドシート、Javascript(Vue)、ブログ運営、電子書籍の作成など今までいろいろな環境で利用してきました。
ちょっととっつきにくいかもしれませんので、持っているおすすめ本もあわせて紹介していきます。
正規表現のおすすめ入門本(電子書籍もあり)
個人的に持っている書籍を何冊か紹介しましょう。バイブルといえば、この本でしょう。
辞書的にひいたいなら、この本です。キンドル版もでています。Amazonで目次が試し読みできます。
他にもUdemy(動画講座)でも正規表現の評判がよい講座がいくつかあります。
udemyで動画の正規表現講座が開催
udemyで動画の正規表現講座が開催しています。書籍より安い値段の場合も多いので、よかったら見てみるといいかも。
他のおすすめ講座の記事もよかったらあわせてみてください。
セールの時期はこちら!まだ一度も利用したことがないなら是非おすすめです。セール時は書籍より安くなります。
正規表現のおすすめ入門書籍(秀丸)
個人的には秀丸ユーザーのため、以前秀丸の本も買いました。詳細はこちらです。
正規表現や言語をオンラインのプログラミングスクールで学ぶ
言語をプログラミングケースで学ぶ場合はこちらの記事をみてください。オンラインのプログラミング教室はかなり格安で学べます。エンジニアならわりとみんな正規表現ができますから、何かのついでに聞いてもよいでしょう。
c言語やphp、aiなど何でもありますよ。
正規表現の使い方
正規表現で行頭と行末にリストタグを挿入・追加する方法
正規表現で行頭と行末にliタグを追加する方法です。
検索文字列 ^(.+) 置換文字列 <li>\1</li>
^行頭の、(.+)文字列を選択します。\1は正規表現でマッチしたパターンの1つ目。
置換前です。
りんご みかん ぶどう
置換後です。
<li>りんご</li> <li>みかん</li> <li>ぶどう</li>
pタグを使うと以下のようになります。
日記です。 今日は雨でした。
<p>日記です。</p> <p>今日は雨でした。</p>
空行はあってもマッチしないないため問題ありません。
ちなみに、\2は正規表現でマッチしたパターンの2つ目です。\3は正規表現でマッチしたパターンの3つ目です。電話番号などで文字列のパターンが切れているものを想像するとわかりやすいでしょう。
03-0000-0000
\0はマッチした文字列全体です。今回は2番目のパターンはないものとして考えています。
秀丸の場合、連続置換マクロを使うと便利です。詳細はこちらの記事をみてください。
javascriptでregexp gのflag
基本。
const reg = new RegExp( patern, flag );
フラグにグローバルマッチのgを使うと
const keywords = [keywords1, keywords2] const result = new RegExp(keywords.join('|'), 'g') console.log( result ); // ["keywords1,", "keywords2,"]
RegExpは文字列内にある、指定した複数のパターンを、すべて置換します。
RegExpの’g’をつけないと違った形の配列が返ってしまうため、キーワードを取り出したいとき、’g’は必須です。
gは第2引数であり、RegExpの場合、第1引数に/gをつけてもnullがかえります。
const array = [keywords1, keywords2] array.join( separator )
こちらはjoinの構文です。配列はjoin(‘|’)なら1つの文字列にできます。|はorです。もちろんseparatorにはいろいろなものが使えます。
RegExpを使わなくてもかけますが、RegExpはエスケープ処理をかかなくていいため、わかりやすいかもしれません。
正規表現ですべてのurlにマッチさせる方法(置換/削除)
^((?:https?:\/\/)?[^./]+(?:\.[^./]+)+(?:\/.*)?)$
stackoverflowさんのサイトが役立ちます。
こちらは以前、秀丸ではなくGoogleスプレッドシートに利用しましたが、基本的に同じです。置換先を空欄にすると削除できます。
正規表現の かつ 含まれない
(PATTERN)(!PATTERN)
かつは括弧で囲ってあげればいいだけ。否定系はおなじみの!。
必要に応じて行頭や行末の加味するからこうなります。
^(?!PATTERN).*$
いらない場合もあります。eslintだと次のように修正されます。
const Reg = ラーメン( !みそ )
特定の文字列を含まれる行を消す置換
検索は下記。
^(.*#).*\n
置換先は空。
検証用のテキスト。
aaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaa#aaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaa #aaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaa# aaaaaaaaaaaaaaaaaaaaaaaaaaaaa # aaaaaaaaaaaaaaaaaaaaaaaaaaaaa
シャープが含まれるurlだけ削除したかったため、作りました。
Google Search ConsoleのCSVって目次のデータが含まれているんですね。目次に飛んだデータだけ消したかったため作りましたね。
シャープのurlがすべて削除されます。純粋な記事数のみ残るため、アクセスがない記事を修正や削除する際に目安をつけやすいです。
正規表現の空行を削除
空行を削除します。
置換前です。
あああ (空行) いいい
置換後です。
あああ いいい
置換する方法です。
検索文字列 ^\n 置換文字列
こちらは簡単な例でした。
英数字
JavaScriptで使いました。
/^[a-z0-9]+$/
英数字とハイフンとアンダースコア
JavaScriptで使いました。
/^[a-z0-9\d-\d_]+$/
正規表現でダブルクォーテーションに囲まれた部分を選択
id="([^"]*)"
正規表現で2重のバックスラッシュ//は改行には適用されない
正規表現で2重のバックスラッシュをつけることがよくあるけど、勢い余って改行までつけてしまう凡ミスをするかもしれません。改行はつけるとnと解釈されてしまうのでNG。
\\n
\n←正しい
一方、文字列内でバックスラッシュ自体を表現したい場合には\\
と書きます。これはJavaScriptに限らず、多くのプログラミング言語で共通のエスケープシーケンスの扱いです。
年月日のフォーマットが正しいかチェックする正規表現
// 日付のフォーマットが正しいかどうかをチェック
function isValidDateFormat(dateString) {
const pattern = /^\d{4}\/\d{1,2}\/\d{1,2}$/;
return pattern.test(dateString);
}
^
: 文字列の先頭を表します。\d{4}
: 4桁の数字に一致します。\/
:/
の文字に一致します。ここでの/
は日付の区切り文字として使用されています。\d{1,2}
: 1桁または2桁の数字に一致します。月と日の部分に対応します。\/
:/
の文字に一致します。\d{1,2}
: 1桁または2桁の数字に一致します。月と日の部分に対応します。$
: 文字列の末尾を表します。
つまり、この正規表現パターンは「YYYY/MM/DD」という形式の日付文字列に一致するかどうかをチェックしています。ここで、Yは4桁の年を表し、Mは1桁または2桁の月を表し、Dは1桁または2桁の日を表します。
例えば、以下のような文字列は一致します:
- “2023/06/11”
- “2022/1/5”
一方、以下のような文字列は一致しません:
- “23/06/11” : 年が4桁ではありません。
- “2023/13/11” : 月が1桁または2桁ではありません。
- “2023/06/111” : 日が1桁または2桁ではありません。
- “2023-06-11” : 区切り文字が
/
ではありません。
正規表現のコツ
ご参考になれば幸いです。
コメント