正規表現(regex)

正規表現(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_]+」でも大丈夫なのです。このように様々な状態を用途に応じて検索する機能をもちます。



文字クラス
文字 意味
[a-c] 囲んだ文字列のいずれかに一致します。ハイフンで文字範囲を指定できます。角括弧に囲まれた最初の文字または最後の文字として現れた場合は特殊文字としては見なされません。
[^x-z] 囲んだ文字列以外の全てに一致します。[^の後に現れたハイフンの扱いは上記と同様。
. 改行を除くあらゆる一文字と一致 or 文字クラス内では普通の文字
\d [0-9]と同等
\D [^0-9]と同等
\w [A-Za-z0-9_]と同等
\W [^A-Za-z0-9_]と同等
\s 空白、タブ、改ページ、改行、その他の Unicode 空白文字などに一致。[\f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff]と同等
\S ホワイトスペース以外の 1 文字に一致。[^ \f\n\r\t\v\u00a0\u1680\u2000-\u200a\u2028\u2029\u202f\u205f\u3000\ufeff] と同等
\t 水平タブ
\r 復帰文字,マッキントッシュの改行(CR)
\n 行送り(改行)(LF)
\r\n Windowsの改行(CR LF) NicoCacheではReplace内で<CRLF>を使うことでも改行にマッチすることが出来ます
\v 垂直タブ
\f 改ページ
[\b] 後退文字
\0 NUL文字
\cX キャレット記法を使用した制御文字。XにはA-Zの文字が入る
\xhh 2桁の16進数のコードからなる文字
\uhhhh 4桁の16進数からなるUTF-16コードに一致
\ エスケープさせる。通常文字に付ける→例えばbを\bをすると単語区切りの意味。特殊文字に付けると文字通りに評価させる。例えば\bを\\bとすると"\b"という文字列に一致する。特別な意味を持たない文字をエスケープしてもエスケープしていないのと同じ扱いになる。
x(バー)y 論理和。xまたはyに一致。大きなパターンの一部にする為にはグループを使う。

境界型アサーション
文字 意味
^ 行頭に一致
$ 行末
\b 単語区切りに一致(ホワイトスペースではない)
\B 単語以外の境界に一致

その他アサーション
文字 意味
x(?=y) "x" の後に "y" が続く場合のみ "x" に一致
x(?!y) "x" の後に "y" が続いていない場合のみ "x" に一致
(?<=y)x "x" の前に "y" がある場合のみ "x" に一致
(?<!y)x "x" の前に "y" がない場合のみ "x" に一致

グループ
文字 意味
(x) x に一致し、一致した内容を記憶させる。Match内では\1,\2,\3... Replace内では$1,$2,$3でアクセス。記憶させるのはパフォーマンスに影響があるので不要であれば後述のキャプチャしないグループを使う。
(?:x) 非キャプチャグループ。記憶しない。
\n Match内でのキャプチャグループのアクセス。記憶した文字列を使う。

数量詞
文字 意味
x* "x" の 0 回以上の繰り返しに一致
x+ "x" の 1 回以上の繰り返しに一致
x? "x" の 0 回か 1 回の出現に一致
x{n} "x" がちょうど "n" 回出現するものに一致。nは正の整数。
x{n,} "x" が "n" 回以上出現するものに一致。nは正の整数。
x{n,m} "x"が"n"回以上"m"回含む回数出現するものに一致。nとmは正の整数。
x*? x+? x?? x{n}? x{n,}? x{n,m}? 既定では * や + といった数量詞は貪欲です。つまり、できる限り多くの文字列と一致しようとします。数量詞の後に ? の文字を指定すると、数量詞が「非貪欲」になります。つまり、一致が見つかるとすぐに停止します。

文字クラスの範囲
範囲 意味
[0-9] 半角数字(これは\dでも指定可能です)
[A-Za-z] 半角ローマ字
[@-Za-z_\.] 半角ローマ字と@と_(アンダースコア)とピリオドで、メールアドレスを構成する文字として解釈できます。「\.」というふうになっているのはピリオドがメタキャラクタであるため、エスケープしています。
[ヲ-゚] 半角カタカナ。半角カタカナのコード順は「ヲァィゥェォャュョッーアイウ」というふうに始まり、濁点半濁点で終わる様になっています。
[亜-腕] 第一水準漢字
[弌-熙] 第二水準漢字
[亜-熙] 第一・二水準漢字
[0-9] 全角数字
[A-z] 全角ローマ字
[ぁ-ん] 全角ひらがな
[ァ-ヶ] 全角カタカナ(全角カタカナのコードはンの後に「ヴヵヶ」が続きます

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



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

例: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にはマッチしません。

例:NicoCache_nlのキャッシュ名正規表現
^(?:(?:[a-z]{2}\d{1,9})(?:|low|kulow)\[(?:[\w-]+)(?:,(?:\d+))?,(?:\d+)\](?:\w*?))(?:_(?:.*))?(?:\.(?:flv|mp4|hls))$
最終更新:2024年06月13日 17:59