正規表現(regex)

※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

正規表現(Regular Expressions;regex;regexp)とは?

正規表現とは、端的に言えば通常の検索よりもずっと複雑な状態を検索するためのものです。
たとえば通常の検索であれば、「nicocache_nl」という文字列に対しては「nicocache_nl」とそのままの形を入力する他にないですが、
正規表現であれば、「nicocache_nl」と入力する以外にも「[a-z]{9}_[a-z]{2}」という形で検索することもできます。
これはすなわちaからzまでのアルファベット小文字が9文字とアンダースコアとアルファベット小文字2文字という意味で検索しています。
もしくは「.*?_.*」でもヒットしますし、「\w+_\w+」でもヒットしますし、「[a-z]+_[a-z]+」という形でもヒットします。
もしくは並び順を捨てて「[a-z_]+」でも大丈夫なのです。このように様々な状態を用途に応じて検索する機能をもちます。




メタ文字


メタ文字は通常の文字としての扱いを外れ、特殊な意味を持ちます。

. (ピリオド、ドット)改行以外の一文字にマッチします
^ (キャレット)行頭にマッチします
$ (ダラー)行末にマッチします
| (バー)いずれかの文字列にマッチします(イメージとしては論理和;OR)
() 丸括弧(まるかっこ)又はパーレン (英: parenthesis, paren)グループ化して記憶しておきます。Match<では\0,\1\2,\3...で参照して再利用出来ます。Replace<では$0,$1,$2,$3...で参照して再利用可能です。
\ (円記号)(補足:日本語環境では公式で文字化けしているため円記号で表示されるが、英語環境ではバックスラッシュ「\(これの半角バージョン)」で表示されます。紛らわしいことこの上ないですね。)
このキャラクタの直後のメタ文字をエスケープし、通常の文字としての扱いを受けるようにする機能があります。例えば、"\^"と書くと"^"で検索されます。

正規表現:. 対象文字列:abc123def456 結果:a,b,c,1,2,3,d,e,f,4,5,6
正規表現:^ 対象文字列:abc123def456 結果:(aの前の空白)
正規表現:$ 対象文字列:abc123def456 結果:(6の後の空白)
正規表現:d|5 対象文字列:abc123def456 結果:d,5
正規表現:(abc) 対象文字列:abc123def456 結果:abc(置換文字列で$1で呼び出せる)
正規表現:abc\$ 対象文字列:abc$123def456 結果:$


量指定子


量指定子とは、文字がどれだけ現れるか(量)定義するものです(指定子)。

* (アスタリスク)0回以上の繰り返し
+ (プラス)一回以上の繰り返し
? (クエスチョンマーク)0回または1回の文字の出現
{n} 波括弧(なみかっこ)又ははブレース・ブレイス (brace)、 カーリーブラケット (curly bracket)、カール (curl)とも呼ばれる"{}"に数字nを書き加えるとn回あらわれることを指定したことになります。
例えばa{3}はaaaにマッチするが、aaaaやaaにはマッチしません。
{n,m} n回以上、m回以下の繰り返しのこと
{n,} n回以上の繰り返しのこと



文字クラス


文字クラスとは、"[]"(角括弧(かくかっこ)またはブラケット (bracket))内になにか表現を書き込むことで、幅のある複数の文字1文字にマッチする機能です。
[abc] aかbかcにマッチする
[a-z] aからzまでの小文字一文字にマッチする
[^abc]  aかbかc以外にマッチする
[0-9] 数字一文字にマッチする
[a-zA-Z0-9] 大文字小文字アルファベット数字のどれか一文字にマッチする
[!-~] 半角文字一文字にマッチする(ASCIIキャラクタコードテーブルを参照のこと)
\d [0-9]に同じ
\s 空白文字にマッチ ([ \r\t\n\f\v] と同じ)
\S	空白以外1文字 ([^ \r\t\n\f\v] と同じ)
\n	改行
\t	タブ
Unix系の改行(LF) \n
マッキントッシュの改行(CR) \r
Windowsの改行(CR LF) \r\n
NicoCacheではReplace<内で<CRLF>を使うことでも改行にマッチすることが出来ます


[0-9]  半角数字(これは\dでも指定可能です)
[A-Za-z]  半角ローマ字
[@-Za-z_\.]  半角ローマ字と@と_(アンダースコア)とピリオドで、メールアドレスを構成する文字として解釈できます。「\.」というふうになっているのはピリオドがメタキャラクタであるため、エスケープしています。
[ヲ-゚]  半角カタカナ。なぜなのかわかりませんけど半角カタカナのコード順は「ヲァィゥェォャュョッーアイウ」というふうに始まり、濁点半濁点で終わる様になっています。

[亜-腕]  第一水準漢字
[弌-熙]  第二水準漢字
[亜-熙]  第一・二水準漢字

[0-9]  全角数字
[A-z]  全角ローマ字
[ぁ-ん]  全角ひらがな
[ァ-ヶ]  全角カタカナ(全角カタカナのコードはンの後に「ヴヵヶ」が続きます

その他

(?:)  グループとして記憶しません 例:(abc)(def)だと\1=abc,\2=defになりますが、(?:abc)(def)とすると\1=def,\2=NULLとなります。
.+ 最長マッチ 別名貪欲なマッチ。たとえば「<tr><td>boom</td></tr>」からHTMLタグのみを取り出したいと考え「<.+> 」という正規表現を書くと結果は「<tr><td>boom</td></tr>」が返ってきます。
これは".+"の条件が続く限り行末までマッチするためです。他に「.*」などがあります。
.+? 最短マッチ 別名控えめマッチ。上記の例で言えば「<.+?> 」とすると「<tr>」「<td>」「</td>」「</tr>」が結果として返ってきます。他には「.*?」があります。
前方参照 AA(?=BB)  文字列AAを検索、ただし直後に文字列BBがあるもののみ 例えば「大谷大学」「大谷高校」「大谷中学」こういった文字列がある場合にこんな正規表現を書くと「大谷(?=大学)」「大谷大学」という結果が返ってきます。
前方参照の否定 AA(?!BB) 文字列AAを検索、ただし直後に文字列BBが無いもののみ さきほどの例で言うと「大谷(?!大学)」となり結果は「大谷高校」「大谷中学」が返ってきます。
後方参照 (?<=AA)BB  文字列BBを検索、ただし直前に文字列AAがあるもののみ 「和風料理」「洋風料理」「中華風料理」という文字列があるとすると「(?<=和風)料理」となり結果は「和風料理」が返ってきます。
後方参照の否定 (?<!AA)BB 文字列BBを検索、ただし直前に文字列AAが無いもののみ 正規表現は「(?<!和風)料理」となり結果は「洋風料理」「中華風料理」が返ってきます。



正規表現チェッカを用いることで、正規表現がどんなものか体験できます。またデバッグに便利です。





参考になりそうな例を置いておきます



例:URL = www\.nicovideo\.jp/watch/[a-z]{2}[0-9]{1,12}
この例では、.(ドット)の前にエスケープメタ文字(\)を置くことで通常の文字としての扱いを受けるようにしています。また、[a-z]でa,b,c,d,e,f,g.....zまでのアルファベット1文字を文字クラスとして指定し、{2}の量指定子でaからzまでの文字が2文字現れることを指定しています。
この場合www.nicovideo.jp/watch/sm123456にマッチしますし、
www.nicovideo.jp/watch/nm9999999にもマッチしますし、
www.nicovideo.jp/watch/so6584231000にもマッチするが、
www.nicovideo.jp/watch/546985327にはマッチしません。


参考:正規表現 オンライン教材 https://www2.otani.ac.jp/fkdsemi/seikihyogen/metamoji-kihon.html
名前:
コメント:
最終更新:2021年10月02日 16:45