正規表現(regex)

正規表現(Regular Expressions;regex)


正規表現とは何か?

正規表現とは、通常の検索よりもずっと複雑な状態を検索するためのもの。nlFilterで主に使ったり使わなかったりする。
たとえば通常の検索であれば、「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_\.]  半角ローマ字と@と_(アンダースコア)とピリオド。メールアドレスを構成する文字。「\.」というふうになっているのはピリオドがメタキャラクタであるため、エスケープしている。
[ヲ-゚]  半角カタカナ。なぜかわからないけど半角カタカナのコード順は「ヲァィゥェォャュョッーアイウ」というふうに始まり、濁点半濁点で終わる。

[亜-腕]  第一水準漢字
[弌-熙]  第二水準漢字
[亜-熙]  第一・二水準漢字(以上はの漢字の範囲指定は処理系により異動があるが、K2Editor、miではこう)

[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
名前:
コメント: