Regular Expressions
「/ (スラッシュ)」 一般的なデリミタ
* 一般的に正規表現のパターンはスラッシュで囲んで正規表現リテラルを構成する。後ろのスラッシュの後にはi、g、m等のフラグ。 e.g. /pattern /flag
* 言語によっては他の文字にデリミタを変更出来る。 e.g.
\(デリミタ文字)…(デリミタ文字)…(GNU sedの場合: (デリミタ文字)は「[[:print:] ]」)
m(デリミタ文字)…(デリミタ文字)…(Perlの場合: (デリミタ文字)は「[[:graph:] ]」)qr(デリミタ文字)…(デリミタ文字)…正規表現パターンのコンパイル
'(デリミタ文字)…(デリミタ文字)'"(デリミタ文字)…(デリミタ文字)"…(PHPの場合: (デリミタ文字)は「[^ \w\s\x5c]」)
%r(デリミタ文字)…(デリミタ文字)…(Rubyの場合: (デリミタ文字)は「[^ \w\s\x5c]」)
#rx"…"#px"…"…(Racketの場合)
/…/(パターン中、何処であれ、直接空白文字を含められない。「/ /」はエラー。「\sは勿論使用出来る」)@/…/(パターンに直接空白文字を含められる。「@/ / 」はエラーにならない) …(Booの場合)
* フラグは一般的に、「i (Ignore case 大文字小文字を区別しない)」、「g (Global マッチしうる全てにマッチ。これが指定されていないと最初のマッチのみ)」、「m (Multiline 複数行でのマッチング)」。
* 「/ (スラッシュ)」の正規表現中のエスケープについては後述。
使用可能言語
ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), sed, GNU sed, AWK, Perl, PHP(PCRE), Ruby, Vim, Boo, etc.
「. (ピリオド)」 任意の1文字
* 任意の1文字 にマッチ。(多くの場合、改行文字は除外)
* 処理系やモードによっては、1文字というよりも1Byte にマッチしたりする。(PHPでは「u」修飾子が指定されていないと、Byte単位でマッチ)
* 多くの言語で、LF にマッチしないだけで、CR にはマッチするので、意外に注意が必要。(Windows環境で「(.+)\n」や「/(.+)$/m」とかすると、マッチした文字列にCR が含まれてしまう)
* 言語によっては単一行モードに変えることで、改行文字にもマッチさせることが出来る。
* 同じECMAScript系でも
DMonkey
*「\x0a \u000a (LF )」も含めて全ての文字にマッチする。
IE / DMDScript
*「\x0a \u000a (LF )」にはマッチしない。
Firefox / Safari / Chrome / Opera
* ECMAの仕様書にある行終端文字「\x0a \u000a (LF )」「\x0d \u000d (CR )」「\u2028 (LS )」「\u2029 (PS )」にはマッチしない。
* 「. (ピリオド)」の正規表現中のエスケープについては後述。
使用可能言語
BRE, ERE, コマンドプロンプトFINDSTR, Bash, Zsh, Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), sed, GNU sed, GNU grep -G, GNU grep -E, GNU grep -P, AWK, Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Lua, Ruby, Java, R, J, Erlang, Racket(#rx, #px), GNU CLISP(REGEXP(BRE, ERE), PCRE), OCaml, Emacs Lisp, Vim, GNU nano, etc.
「[] (大括弧)」 文字のクラス化
* 大括弧内のどれか1文字 とマッチ。 e.g. [ABC]…A・B・Cのどれか1つにマッチ。
* 「[ (開き大括弧)」、「] (閉じ大括弧)」の正規表現中のエスケープについては後述。
* RubyやPHP(mb_ereg)等の鬼車エンジンの正規表現やJavaでは、「[] (大括弧)」の中に「[] (大括弧)」を含めるOr やAnd の表現がある。 e.g.
「[A-Z[ 0-9] ]」…「A-Z」または 「0-9」⇔「[A-Z0-9]」
「[A-Z&& [ D-G] ]」…「A-Z」かつ 「D-G」⇔「[D-G]」
「[A-Z&& [ ^ D-G] ]」…「A-Z」かつ 「D-G」を除く⇔「[A-CH-Z]」
* .NETの正規表現では、「[] (大括弧)」の中に除外したい文字・文字クラスを含める、減算表現がある。 e.g.
「[A-Z- [D-G]]」…「A-Z」から「D-G」を除く⇔「[A-CH-Z]」
使用可能言語
BRE, ERE, コマンドプロンプトFINDSTR、Bash, Zsh, Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), sed, GNU sed, GNU grep -G, GNU grep -E, GNU grep -P, AWK, Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Lua, Ruby, Java, R, J, Erlang, Racket(#rx, #px), GNU CLISP(REGEXP(BRE, ERE), PCRE), OCaml, Emacs Lisp, Vim, GNU nano, etc.
「[^] (大括弧・サーカムフレックス)」 文字の否定クラス化
* 大括弧内の文字のどれでもない何か1文字 とマッチ。 e.g. [^ABC]…A・B・C以外の何か1文字にマッチ。
* 「^ (サーカムフレックス)」文字そのもののエスケープについては後述。
使用可能言語
BRE, ERE, コマンドプロンプトFINDSTR, Bash, Zsh, Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), sed, GNU sed, GNU grep -G, GNU grep -E, GNU grep -P, AWK, Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Lua, Ruby, Java, R, J, Erlang, Racket(#rx, #px), GNU CLISP(REGEXP(BRE, ERE), PCRE), OCaml, Emacs Lisp, Vim, GNU nano, etc.
「- (ハイフン)」 文字クラスの範囲指定
* 大括弧の中の文字を列挙する代わりに、「- (ハイフン)」で範囲の指定も可能。 e.g. [A-Z]…半角アルファベット大文字(英語)のどれか1文字 にマッチ。
* 否定クラスの場合は、範囲指定された文字クラスが全否定される。(部分否定ではない) e.g. [^A-Z]…半角アルファベット大文字(英語)以外の何か1文字 にマッチ。
* 「- (ハイフン)」の正規表現中のエスケープについては後述。
使用可能言語
BRE, ERE, コマンドプロンプトFINDSTR, Bash, Zsh, Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), sed, GNU sed, GNU grep -G, GNU grep -E, GNU grep -P, AWK, Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Lua, Ruby, Java, R, J, Erlang, Racket(#rx, #px), GNU CLISP(REGEXP(BRE, ERE), PCRE), OCaml, Emacs Lisp, Vim, GNU nano, etc.
「() (小括弧)」 文字列のグループ化 (Capturing Group )
* 小括弧の中の文字列をグループ化。部分表現として、1文字毎ではなく文字列でマッチ。 e.g. (ABC)…文字列 ABCにマッチ。
* マッチした文字列は後方参照で呼び出せる。 e.g. /A(BC)/.exec("ABCDEFG"); alert(RegExp.$1 ); …「BC 」と表示。(JavaScriptの場合)
* BRE、sed(及び「-r」オプションを付けないGNU sed)、GNU CLISP(REGEXP BRE), Emacs Lisp、Vimでは「\( \) (バックスラッシュ・小括弧)」を用い、後方参照は「\1、\2、…」で呼び出す。(EREでは単に「( )」) 「"" (ダブルクォーテーション)」に囲まれた文字列の中で使用される場合、「\\(」のように「\ (バックスラッシュ)」を続けることに注意。
* AWKは標準ではグループ化だけで、後方参照は利用出来ないが、gawkのgensub()関数では使用可能。
* 「( (開き小括弧)」、「) (閉じ小括弧)」の正規表現中のエスケープについては後述。
使用可能言語
BRE, ERE, コマンドプロンプトFINDSTR, Bash, Zsh, Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), sed, GNU sed, GNU grep -G, GNU grep -E, grep -P, (AWK), Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Lua, Ruby, Java, R, J, Erlang, Racket(#rx, #px), GNU CLISP(REGEXP(BRE, ERE), PCRE), OCaml, Emacs Lisp, Vim, GNU nano, etc.
「(?:) (小括弧・クエスチョンマーク・コロン)」 文字のグループ化 (Non-Capturing Group )
* 小括弧の中の文字列をグループ化。部分表現として、1文字毎ではなく文字列でマッチ。 e.g. (?:ABC)…文字列 ABCにマッチ。
* 但し、マッチした文字列をキャッシュしないので、後から参照出来ない。 e.g. /A(?:BC)/.exec("ABCDEFG"); RegExp.$1 ? alert("True") : alert("False"); …「False 」と表示。(JavaScriptの場合)
* Emacs Lispでは「\\(?: \\) (バックスラッシュ・バックスラッシュ・小括弧・クエスチョンマーク・コロン)」を用いる。「"" (ダブルクォーテーション)」に囲まれた文字列の中で使用されるので、「\\」のように「\ (バックスラッシュ)」を続けることに注意。
* Vimでは、「\%(subpattern \) (バックスラシュ・パーセント・開き小括弧・部分表現・バックスラッシュ・閉じ小括弧)」。
使用可能言語
Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), GNU grep -P, Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Ruby, Java, R, J, Erlang, Racket(#rx, #px), GNU CLISP(PCRE), Emacs Lisp, Vim, etc.
「(?<名前 >) (小括弧・クエスチョンマーク・レスザンサイン・名前・グレーターザンサイン)」 名前付きキャプチャ (Named Capturing Groups ) (.NET系) 「(?P <名前 >) (小括弧・クエスチョンマーク・大文字P・レスザンサイン・名前・グレーターザンサイン)」 名前付きキャプチャ (Named Capturing Groups ) (Python系)
* 小括弧の中の文字列をグループ化。部分表現として、1文字毎ではなく文字列でマッチ。 e.g. (?<Name>ABC)…文字列 ABCにマッチ。
* マッチした文字列は、付けた名前でもアクセス出来る。(普通のグルーピングとして数値でもアクセス可) e.g. ( 'ABABCD' -Replace '(?<Name>[A-Z]{2})\k<Name>', '${Name}Z' )…「ABZCD 」と表示。(Powershellの場合) cf. ( 'ABABCD' -Replace '(?<Name>[A-Z]{2})\1', '$1Z' )…「ABZCD 」と表示。(Powershellの場合)
* Python系と.NET系の記法が混在している…。例えば、PHPでは、「(?P <名前 >)」というPython風でも「(?<名前 >)」という.NET風でもOK。(PHPでは元々Python風の記法だった)
* 処理系によっては同じ名前を持ったグループが複数あっても許されるが、振る舞いは異なる。
Perl
後方参照の利用はその名前を持ったグループの内一番左側の物となる。
「%- (パーセント・マイナス)」ハッシュを使えば、複数の同名グループのキャプチャについて各々にアクセス出来る。
括弧に付けられる番号は、名前付き・名前無しに関わらず、左から順に付けられる。同じ名前を持ったグループも別々に番号が付けられる。
.NET
後方参照の利用はその名前を持ったグループの内最後、つまり一番右側の物となる。
MatchオブジェクトのCapturesプロパティを使えば、複数の同名グループのキャプチャについて各々にアクセス出来る。
括弧に付けられる番号は、左から順に名前の無いグループから 付けられ、その後で左から順に名前付きグループに番号が付けられる。同じ名前を持ったグループは、開き括弧が1番左側にあるグループに番号が付けられ、他の同名グループはその番号のグループの「Captures」に格納される。値は、閉じ括弧が一番右側にあるグループの値が「Value」に設定される。他の同名グループの値にアクセスするには、「Captures」からアクセスする。
Python, Java, PCRE(Zsh(--rematchpcre), GNU grep -P, PHP, R, J, Erlang, GNU CLISP(PCRE))
基本、同名のグループは不可。(PCREの場合、ライブラリを「PCRE_DUPNAMES」オプション付きでビルドすると、同名グループも使用出来るようになるみたい)
鬼車(Ruby, PHP(mb_ereg))
名前付きグループを使用したパターン内では、例え名前が付いていないグループがパターンに含まれていても、番号での後方参照が一切許されなくなる。 e.g. (?<Name>AB)\k<1>…エラー。(?<Name>AB)(CD)\k<1>…これもエラー。
同名のグループが複数ある時、先ず一番後ろのグループとのマッチングを試み、それに失敗すると1つづつ前のグループとのマッチングを試みる。キャプチャされる値は、一番最後のグループに対応する値。 e.g. (?<n1>\w)(?<n1>\w)(?<n1>\w)\k<n1>…このパターンは、例えば「ABCA 」にも「ABCB 」にも「ABCC 」にもマッチする。キャプチャされるのは「C 」。
* PHP5.4x以前のmb_eregでは、部分表現に付ける「名前」に大文字が使えない。(PHP5.6xとかでは、大文字も使える)
* Emacs Lispでは、この名前付きグループの変形として、「\\(?n :subpattern \\) (バックスラッシュ・バックスラッシュ・小括弧・クエスチョンマーク・符号無し整数・コロン・部分表現)」をサポートしている。 e.g. (string-match "\\(?2 :AB\\)\\2 " "ABABCD")…「0 」と表示。(i.e. マッチ)
使用可能言語
Zsh(--rematchpcre), GNU grep -P, Perl, PHP(mb_ereg, PCRE), 鬼車, .NET, Powershell, Boo, Python, Ruby, Java(SE7〜 ), R, J, Erlang, GNU CLISP(PCRE), (Emacs Lisp), etc.
「Recursion (再帰)」 パターンの再帰・再利用
* 色々なチュートリアルでは、例示が少々難解…。(確かに実際にはそういう場面で使用するんだろうけど…)
* Rubyでは、「Subexpression Call (部分式呼び出し)」と呼ばれている。
* Perl系の記法とRuby(鬼車)系の記法がある。PHP(PCRE)等、両方サポートしている処理系もある。
「(?n ) (開き小括弧・クエスチョンマーク・符号無し整数・閉じ小括弧)」 (Perl系) 「\g<n > (バックスラッシュ・小文字ジー・レスザンサイン・符号無し整数・グレーターザンサイン)」「\g'n ' (バックスラッシュ・小文字ジー・シングルクォーテーション・符号無し整数・シングルクォーテーション)」 (Ruby系)
* 再帰の絶対的な指定。n 番目の括弧内のサブパターンに再帰する。
e.g. qq/AB/ =~ m/([AB])(?1)/; print $& ; …「AB 」と表示。(Perlの場合)
* つまり、通常の後方参照を利用したパターン「([AB])\1」が文字列「AA 」もしくは「BB 」にしかマッチしないのに対し、再帰を使ったパターン「([AB])(?1)」は「AA 」「BB 」以外に「AB 」「BA 」にもマッチする。
* マッチングのバックトラックやキャプチャについて、Perl・PHP等のPCRE・Rubyで振る舞いが異なるので注意。
Perl
e.g. qq/ABCD/ =~ m/(\w+)(?1)/; print $& . q/-/ . $1 ; …「ABCD-ABC 」と表示。 これは、「(\w+)」が「ABCD 」の最後までマッチした後、「(?1)」が最低1文字必要な為、後ろに退いて(バックトラック)マッチを試みている。
e.g. qq/ABCD/ =~ m/(\w+)(?1)D/; print $& . q/-/ . $1 ; …「ABCD-AB 」と表示。 これは、「\w+」が文字列の最後までマッチして、その後「(?1)」「D 」にマッチする為に後ろに退いて(バックトラック)マッチを試みている。
PHP
e.g. echo preg_match('/(\w+)(?1)/', 'ABCD', $matches ), '-', $matches[0] , '-', $matches[1] ; …「1-ABCD-ABC 」と表示。 Perl同様、後ろに退いて(バックトラック)マッチを試みている。
e.g. echo preg_match('/(\w+)(?1)D/', 'ABCD', $matches ); …「0 」と表示。(i.e. マッチしない) これは、「\w+」が文字列の最後までマッチして、その後「(?1)」「D 」にマッチする為に後ろに退き(バックトラック)、その後「(?1)」がまた文字列の最後までマッチした後バックトラックしない為、「D 」とマッチしない。
* つまり、PCREではバックトラックしない。
* mb_eregでは、Rubyと同様の記法・同様の振る舞いとなる。
Ruby
e.g. p ( 'ABCD' =~ /(\w+)\g<1>/ ).to_s + '-' + $& + '-' + $1 ; …「"0-ABCD-D" 」と表示。最初の「(\w+)」ではなく、そこに再帰した「\g<1>」にマッチした部分がキャプチャされている。
e.g. p ( 'ABCD' =~ /(\w+)\g<1>D/ ).to_s + '-' + $& + '-' + $1 ; …「"0-ABCD-C" 」と表示。
* これらから、どうやらRubyではバックトラックする模様。(PHP(mb_ereg)も同じ振る舞い)
「(?-n ) (開き小括弧・クエスチョンマーク・マイナス・整数・閉じ小括弧)」 「(?+n ) (開き小括弧・クエスチョンマーク・プラス・整数・閉じ小括弧)」 (Perl系) 「\g<-n > (バックスラッシュ・小文字ジー・レスザンサイン・マイナス・数字・グレーターザンサイン)」「\g'-n ' (バックスラッシュ・小文字ジー・シングルクォーテーション・マイナス・数字・シングルクォーテーション)」「\g<+n > (バックスラッシュ・小文字ジー・レスザンサイン・プラス・数字・グレーターザンサイン)」「\g'+n ' (バックスラッシュ・小文字ジー・シングルクォーテーション・プラス・数字・シングルクォーテーション)」 (Ruby系)
* 再帰の相対的な指定。n 個前・n 個後の括弧内のパターンに再帰する。(「(?1)」と「(?+1)」は意味合いが違うことに注意)
e.g. qq/ABCD1234/ =~ m/(\w{2})(?-1)(?+1)(\d{2})/; print $& . q/-/ . $1 . q/-/ . $2 ; …「ABCD1234-AB-34 」と表示。(Perlの場合) ここで、「(?-1)」は「(\w{2})」に再帰し「CD 」にマッチし、「(?+1)」は「(\d{2})」に再帰し「12 」にマッチ。
* Ruby1.xでは、「\g<-n>」「\g'-n'」のみサポートで、「\g<+n>」「\g'+n'」はサポートされていない。(Manualにはあるのに…) Ruby2.xでは両方サポート。
* つまり、Ruby2.0以降を除く鬼車系(Ruby1.x、PHP(mb_ereg))では、「\g<+n >」はサポートされていない。
e.g. p ( 'ABCD1234' =~ /(\w{2})\g<-1>\g<+1>(\d{2})/ ).to_s() + '-' + $& + '-' + $1 + '-' + $2 ; …「"0-ABCD1234-CD-34" 」と表示。ここで、1番目のキャプチャは「(\w){2}」に再帰した「\g<-1>」にマッチする部分「CD 」で、2番目のキャプチャは最後の「(\d{2})」にマッチする「34 」。つまり、後の方のサブマッチがキャプチャされる。
* Jでは、この相対指定はサポートされていないみたい。
「(?&名前 ) (開き小括弧・クエスチョンマーク・アンパサンド・名前・閉じ小括弧)」「(?P>名前 ) (開き小括弧・クエスチョンマーク・大文字ピー・グレーターザンサイン・名前・閉じ小括弧)」 (Perl系) 「\g<名前 > (バックスラッシュ・小文字ジー・レスザンサイン・名前・グレーターザンサイン)」「\g'名前 ' (バックスラッシュ・小文字ジー・シングルクォーテーション・名前・シングルクォーテーション)」 (Ruby系)
* 名前付きのサブパターンに再帰する。
e.g. qq/ABCD/ =~ m/(?<First>\w+)(?&First)/; print $& . q/-/ . $+{First} ; …「ABCD-ABC 」と表示。(Perlの場合)
* 「(?&名前)」と「(?P>名前)」は等価。 e.g. qq/ABCD/ =~ m/(?P<First>\w+)(?P>First)/; print $& . q/-/ . $+{First} ; …「ABCD-ABC 」と表示。(Perlの場合)
「(?R) (開き小括弧・クエスチョンマーク・大文字アール・閉じ小括弧)」「(?0) (開き小括弧・クエスチョンマーク・ゼロ・閉じ小括弧)」 (Perl系) 「\g<0> (バックスラッシュ・小文字ジー・レスザンサイン・ゼロ・グレーターザン)」「\g'0' (バックスラッシュ・小文字ジー・シングルクォーテーション・ゼロ・シングルクォーテーション)」 (Ruby系)
* パターン全体の最初に再帰する。
e.g. qq/ab\t12 -%/ =~ m/\w{2}\s(?R)*/; print $& ; …「1-ab 12 」と表示。(Perlの場合)
* 「(?R)」と「(?0)」は等価。
* パターン全体の最初に再帰するので、ここでは0回を含む量指定子「?」「*」「{0,}」が必要。
* Ruby2.0以降を除く鬼車系(Ruby1.x、PHP(mb_ereg))ではサポートされていない。
使用可能言語
Zsh(--rematchpcre), GNU grep -P, Perl, PHP(mb_ereg, PCRE), 鬼車, (Python?), Ruby, R, J, Erlang, GNU CLISP(PCRE), etc.
「| (縦線)」 選言演算子
* この演算子の前後いずれかの文字・文字列にマッチ。 e.g. /ABC|DEF/…文字列「ABC 」もしくは「DEF 」にマッチ。
* なんだかBNF な表現…。
* WindowsコマンドプロンプトのFINDSTRでは、「/C」スイッチを付けないパターン中で文字列を半角スペース区切りすると複数文字列のOR検索が出来る。(パターン中に半角スペースを含めたい時は、「/R /C:"文字列 文字列"」のように、「/R」「/C」スイッチを指定する。但しこの場合はOR検索は出来ない)
* 「-r」オプションを付けないGNU sed及び「-G」オプションが付いたGNU grep、GNU CLISP(REGEXP BRE), Emacs Lisp、Vimでは、「\| (バックスラッシュ・縦線)」を用いる。「"" (ダブルクォーテーション)」に囲まれた文字列の中で使用される場合、「\\|」のように「\ (バックスラッシュ)」を続けることに注意。
* 「| (縦線)」の正規表現中のエスケープについては後述。
使用可能言語
ERE, (コマンドプロンプトFINDSTR), Bash, Zsh, Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), GNU sed, GNU grep -G, GNU grep -E, GNU grep -P, AWK, Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Ruby, Java, R, J, Erlang, Racket(#rx, #px), GNU CLISP(REGEXP(BRE, ERE), PCRE), OCaml, Emacs Lisp, Vim, GNU nano, etc.
「(?modifiers -modifiers :subpattern ) (小括弧・クエスチョンマーク・修飾子・マイナス・修飾子・コロン・部分表現・小括弧)」 埋め込みフラグ
* 「(?」と「)」の間の修飾子でパターン内部で細かく正規表現マッチングの挙動を制御する。 e.g. print 'AB' =~ m/(?i:ab)/;…「1 」と表示(i.e. マッチ)。(Perlの場合)
* 「- (マイナス)」を修飾子の前に付けると、設定を解除。 e.g. print ( ( 'AB' =~ m/(?-i:ab)/i ) eq '' ); …「1 」と表示(i.e. 「i」修飾子の効果が無くなり、マッチングの返り値が「'' (空文字列)」、つまりマッチしなくなっている)。(Perlの場合)
* 「:subpattern (コロン・部分表現)」を省略すると、次の埋め込みフラグで挙動が変更されるまで、パターン全体の挙動が変わる。 e.g. print 'Ab' =~ m/(?i)a(?-i)b/;…「1 」と表示(i.e. マッチ)。(Perlの場合)
* Racketでは「:subpattern (コロン・部分表現)」を省略出来ない。
* 使用出来る修飾子は各言語に依る。
* Tclでは「- (マイナス)」による否定表現はサポートされていない。
* Vimでは「\c」「\C」といったシークェンスをパターンに含めることで同様なことが出来る。
使用可能言語
Zsh(--rematchpcre), GNU grep -P, Perl, PHP(mb_ereg, PCRE), 鬼車, .NET, Powershell, Boo, Python, Tcl, Ruby, Java, R, J, Erlang, Racket(#rx, #px), GNU CLISP(PCRE), (Vim), etc.
* 「(?#」と「)」の間のcomment は無視されてコメントとして扱われる。 e.g. print join("-", ("ABCDEF" =~ m/(?#コメントです)\w{3}/gm));…「ABC-DEF 」と表示。(Perlの場合)
* この構文が無い言語でも、「/x (拡張)」オプションでパターン中にコメントを入れることが出来る言語もある。
使用可能言語
Zsh(--rematchpcre), GNU grep -P, Perl, PHP(mb_ereg, PCRE), 鬼車, .NET, Powershell, Boo, Python, Tcl, Ruby, R, J, Erlang, GNU CLISP(PCRE), etc.
「* (アスタリスク)」 0回以上の繰り返し (最長マッチ)
* 直前のパターンに0回以上マッチ。 e.g. /AB*/…文字列「A 」、「AB 」、「ABB 」、「ABBB 」、... にマッチ。
* greedy (貪欲な )と形容されるように、可能な限り長くマッチングを行うので、注意が必要。 e.g. alert("ACABCABBCABBBC".match(/A.*C/g).join("-")); …ACやABC等ではなく「ACABCABBCABBBC 」と表示。(JavaScriptの場合)
* 「* (アスタリスク)」の正規表現中のエスケープについては後述。
使用可能言語
BRE, ERE, コマンドプロンプトFINDSTR, Bash, Zsh, Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), sed, GNU sed, GNU grep -G, GNU grep -E, GNU grep -P, AWK, Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Lua, Ruby, Java, R, J, Erlang, Racket(#rx, #px), GNU CLISP(REGEXP(BRE, ERE), PCRE), OCaml, Emacs Lisp, Vim, GNU nano, etc.
「*? (アスタリスク・クエスチョンマーク)」 0回以上の繰り返し (最小マッチ)
* 直前のパターンに0回以上マッチ。 e.g. /AB*?/…文字列「A 」、「AB 」、「ABB 」、「ABBB 」、... にマッチ。
* greedy (貪欲な )に対してlazy やnon-greedy 、minimal 等と形容され、マッチする中で一番手前までマッチ。 e.g. alert("ACABCABBCABBBC".match(/A.*?C/g).join("-")); (JavaScriptの場合)
* この最小マッチをサポートしていない言語、例えばAWKとかだと、/A[^C]*C/としたりしないといけない…。
* Luaでは単一の量指定子「- (マイナス)」を使う。 e.g. result = {}; for value in string.gmatch("ACABCABBCABBBC", "A.-C") do table.insert(result , value ); end; print(table.concat(result , "-"));…「AC-ABC-ABBC-ABBBC 」と表示。
* 「-r」オプションを付けないGNU sed及び「-G」オプションが付いたGNU grepでは、「*\? (アスタリスク・バックスラッシュ・クエスチョンマーク)」を用いる。
使用可能言語
Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), GNU sed, GNU grep -G, GNU grep -E, GNU grep -P, Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Lua, Ruby, Java, R, J, Erlang, Racket(#rx, #px), GNU CLISP(PCRE), Emacs Lisp, etc.
「+ (プラス)」 1回以上の繰り返し (最長マッチ)
* 直前のパターンに1回以上マッチ。i.e. A+ ⇔ AA* e.g. /AB+/…文字列「AB 」、「ABB 」、「ABBB 」、... にマッチ。
* greedy (貪欲な )と形容されるように、可能な限り長くマッチングを行うので、注意が必要。 e.g. alert("ACABCABBCABBBC".match(/A.+C/g).join("-")); …ABCやABBC等ではなく「ACABCABBCABBBC 」と表示。(JavaScriptの場合)
* 「-r」オプションを付けないGNU sed及び「-G」オプションが付いたGNU grep、Vimでは、「\+ (バックスラッシュ・プラス)」を用いる。
* 「+ (プラス)」の正規表現中のエスケープについては後述。
使用可能言語
ERE, Bash, Zsh, Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), sed, GNU sed, GNU grep -G, GNU grep -E, GNU grep -P, AWK, Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Lua, Ruby, Java, R, J, Erlang, Racket(#rx, #px), GNU CLISP(REGEXP(BRE, ERE), PCRE), OCaml, Emacs Lisp, Vim, GNU nano, etc.
「+? (プラス・クエスチョンマーク)」 1回以上の繰り返し (最小マッチ)
* 直前のパターンに1回以上マッチ。i.e. A+? ⇔ AA*? e.g. /AB+?/…文字列「AB 」、「ABB 」、「ABBB 」、... にマッチ。
* greedy (貪欲な )に対してlazy やnon-greedy 、minimal 等と形容され、マッチする中で一番手前までマッチ。 e.g. alert("ACABCABBCABBBC".match(/A.+?C/g).join("-")); …「ACABC-ABBC-ABBBC 」と表示。(JavaScriptの場合) 最も左側からマッチしていくので、この文字列の場合「ABC」にマッチしないことに注意。
* この最小マッチをサポートしていない言語、例えばAWKとかだと、/A[^C]+C/としたりしないといけない…。
* Luaではサポートされていないが、「- (マイナス)」量指定子を使えばいい。 e.g. result = {}; for value in string.gmatch("ACABCABBCABBBC", "A..-C") do table.insert(result , value ); end; print(table.concat(result , "-"));…「ACABC-ABBC-ABBBC 」と表示。
* 「-r」オプションを付けないGNU sed及び「-G」オプションが付いたGNU grepでは、「\+\? (バックスラッシュ・プラス・バックスラッシュ・クエスチョンマーク)」を用いる。
使用可能言語
Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), GNU sed, GNU grep -G, GNU grep -E, GNU grep -P, Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Ruby, Java, R, J, Erlang, Racket(#rx, #px), GNU CLISP(PCRE), Emacs Lisp, etc.
「? (クエスチョンマーク)」 直前が0回か1回
* 0回か1回の直前のパターンにマッチ。 e.g. /AB?/…文字列「A 」、「AB 」にマッチ。
* 所謂greedy (貪欲な )なマッチングを行うので注意。 e.g. alert("ACABCABBCABBBC".match(/A.?/));…「AC 」と表示。(JavaScriptの場合)
* 「-r」オプションを付けないGNU sed及び「-G」オプションが付いたGNU grep、Vimでは、「\? (バックスラッシュ・クエスチョンマーク)」を用いる。
* Vimでは他に「\= (バックスラッシュ・イコール)」という等価な表現もサポートしている。(「? (クエスチョンマーク)」がコマンドとして使用されることがあるため)
* 「? (クエスチョンマーク)」の正規表現中のエスケープについては後述。
使用可能言語
ERE, Bash, Zsh, Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), GNU sed, GNU grep -G, GNU grep -E, GNU grep -P, AWK, Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Lua, Ruby, Java, R, J, Erlang, Racket(#rx, #px), GNU CLISP(REGEXP(BRE, ERE), PCRE), OCaml, Emacs Lisp, Vim, GNU nano, etc.
「?? (クエスチョンマーク・クエスチョンマーク)」 直前が0回か1回 (最小マッチ)
* 0回か1回の直前のパターンにマッチ。 e.g. /AB?/…文字列「A 」、「AB 」にマッチ。
* 所謂lazy なマッチングを行うので、時々注意が必要。 e.g. alert("ACABCABBCABBBC".match(/A.??/));…「A 」と表示。(JavaScriptの場合)
* 「-r」オプションを付けないGNU sed及び「-G」オプションが付いたGNU grepでは、「\?\? (バックスラッシュ・クエスチョンマーク・バックスラッシュ・クエスチョンマーク)」を用いる。
使用可能言語
Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), GNU sed, GNU grep -G, GNU grep -E, GNU grep -P, Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Ruby, Java, R, J, Erlang, Racket(#rx, #px), GNU CLISP(PCRE), Emacs Lisp, Emacs Lisp, etc.
「{} (中括弧)」 回数指定の繰り返し
* {n } 直前のパターンのn 回の繰り返しにマッチ。 e.g. /AB{2}/…文字列「ABB 」にマッチ。
* {m,n } 直前のパターンのm 回以上n 回以下の繰り返しにマッチ。コンマの後にうっかりスペースを入れたりしないこと。 e.g. /AB{2,4}/…文字列「ABB 」、「ABBB 」、「ABBBB 」にマッチ。
* {m, } 直前のパターンのm 回以上の繰り返しにマッチ。コンマの後にうっかりスペースを入れたりしないこと。 e.g. /AB{2,}/…文字列「ABB 」、「ABBB 」、「ABBBB 」、...、にマッチ。
* {0,n } 、{1,n } 直前のパターンのn 回以下の繰り返しにマッチ。直前のパターンが0回の場合も含める時は、{0,n}。直前のパターンが少なくとも1回は現れないといけない時は、{1,n}。
* i.e.
* マッチングはgreedy (貪欲な )なので、最小マッチの時は{n}?、{m,n}?、{m,}?のようにする
* BRE、「-r」オプションを付けないGNU sed及び「-G」オプションが付いたGNU grep、Emacs Lisp、Vim(但しVimの場合、閉じ中括弧に関しては、その前のバックスラッシュは付けても付けなくても良い)では、「\{ \} (バックスラッシュ・中括弧)」を用いる。「"" (ダブルクォーテーション)」に囲まれた文字列の中で使用される場合、「\\{ \\}」のように「\ (バックスラッシュ)」を続けることに注意。
* gawkでこの表現を使う時は、gawk -W re-intervalのように、コマンドラインオプション-W re-intervalもしくは--re-intervalを指定する。(AWKは標準では繰り返し回数の指定をサポートしていない)
* Vimでは、最小マッチは開き中括弧の直後に「- (マイナス)」を記述することでサポート。
*
* 「{ (開き中括弧)」、「} (閉じ中括弧)」の正規表現中のエスケープについては後述。
使用可能言語
BRE, ERE, Bash, Zsh, Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), GNU sed, GNU grep -G, GNU grep -E, GNU grep -P, (AWK), Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Ruby, Java, R, J, Erlang, Racket(#px), GNU CLISP(REGEXP(BRE, ERE), PCRE), Emacs Lisp, Vim, GNU nano, etc.
「Possesive Quantifiers (絶対最大量指定子)」 バックトラックしない最長マッチ
* 「*+ (アスタリスク・プラス)」「++ (プラス・プラス)」「?+ (クエスチョンマーク・プラス)」「{}+ (中括弧・プラス)」
* 最長マッチをするけど、最終的なマッチを優先せず、マッチに失敗した時に後ろに戻ってのマッチを試みない。 e.g. 文字列「"ACABCABBCABBBC" 」に対して、「/A.*+/」はマッチするが、「/A.*+C/」はマッチしない。 cf. 「/A.*C/」はマッチする。これは「.*」が文字列の最後までマッチした後、文字「"C"」にマッチしないので、後ろに退いて(バックトラック)文字「"C"」とのマッチを試みるから。
e.g. ( $_ = 'ACABCABBCABBBC' ) =~ m/A.?+C/; print $& ; …「ABC 」と表示。(Perlの場合) cf. ( $_ = 'ACABCABBCABBBC' ) =~ m/A.?C/; print $& ; ( $_ = 'ACABCABBCABBBC' ) =~ m/A.??C/; print $& ; …いずれも「AC 」と表示。(Perlの場合)
* マッチに失敗 する時の速度向上に効果があるらしい。
使用可能言語
Zsh(--rematchpcre), GNU grep -P, Perl, PHP(mb_ereg, PCRE), 鬼車, Ruby, Java, R, J, Erlang, GNU CLISP(PCRE), etc.
「(?>subpattern) (小括弧・クエスチョンマーク・グレーターザンサイン・部分表現・小括弧)」 バックトラックしないグルーピング (Atomic Grouping )
* 最終的なマッチを優先せず、マッチに失敗した時に後ろに戻ってのマッチを試みない。 e.g. 文字列「"ACABCABBCABBBC" 」に対して、「/A.*+/」はマッチするが、「/(?>A.*)C/」はマッチしない。 cf. 「/A.*C/」はマッチする。これは「.*」が文字列の最後までマッチした後、文字「"C"」にマッチしないので、後ろに退いて(バックトラック)文字「"C"」とのマッチを試みるから。
* i.e.
e.g. ( $_ = 'ACABCABBCABBBC' ) =~ m/(?>A.?)C/; print $& ; …「ABC 」と表示。(Perlの場合) cf. ( $_ = 'ACABCABBCABBBC' ) =~ m/A.?C/; print $& ; ( $_ = 'ACABCABBCABBBC' ) =~ m/A.??C/; print $& ; …いずれも「AC 」と表示。(Perlの場合)
* グルーピングではあるけど、キャプチャされない。
* Vimでは「\@> (バックスラッシュ・アトマーク・グレーターザンサイン)」という記法でこの機能をサポート。
使用可能言語
Zsh(--rematchpcre), GNU grep -P, Perl, PHP(mb_ereg, PCRE), 鬼車, .NET, Powershell, Boo, Ruby, Java, R, J, Erlang, Racket(#rx, #px), GNU CLISP(PCRE), Vim, etc.
「^ (サーカムフレックス)」 先頭にマッチ
* 文字列または行の先頭にマッチ。 e.g. alert("ACABCABBCABBBC".match(/^A./gm).join("-"));…「AC 」とのみ表示。(JavaScriptの場合)
* 行頭にマッチするので、改行文字が文字列中に埋め込まれていた場合、その直後にもマッチ。(複数行フラグの指定を忘れないように) e.g. alert("ACABCABBC\nABBBC".match(/^A./gm).join("-"));…「AC-AB 」と表示。(JavaScriptの場合)
* 入力の最初にだけマッチするか、改行文字の直後にもマッチするか言語毎に異なるので、注意が必要。
* JavaScript/JScriptでHTMLのテキストノードを扱う場合、いくらソース中で改行がされていても空白文字とされ、1つのブロック要素内のテキストは1行扱いになるので注意。(innerTextを使った時とかは、<br>の後にもマッチしたりするけど…)
* コマンドプロンプトFINDSTRではFINDSTR /Bでも行頭にマッチさせることが出来る。
* Vimでは、パターンの先頭にしか使えない「^ (サーカムフレックス)」以外に、パターン中どこでも使用出来る「\_^ (バックスラッシュ・アンダースコア・サーカムフレックス)」という記法も使える。
* 「^ (サーカムフレックス)」の正規表現中のエスケープについては後述。
使用可能言語
BRE, ERE, コマンドプロンプトFINDSTR, Bash, Zsh, Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), sed, GNU sed, GNU grep -G, GNU grep -E, GNU grep -P, AWK, Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Lua, Ruby, Java, R, J, Erlang, Racket(#rx, #px), GNU CLISP(REGEXP(BRE, ERE), PCRE), OCaml, Emacs Lisp, Vim, GNU nano, etc.
「$ (ドルマーク)」 末尾にマッチ
* 文字列または行の末尾にマッチ。 e.g. alert("ACABCABBCABBBC".match(/.C$/gm).join("-"));…「BC 」とのみ表示。(JavaScriptの場合)
* 行末にマッチするので、改行文字が文字列中に埋め込まれていた場合、その直前にもマッチ。(複数行フラグの指定を忘れないように) e.g. alert("ACABCABBC\nABBBC".match(/.+C$/gm).join("-"));…「ACABCABBC-ABBBC 」と表示。(JavaScriptの場合)
* 入力の最初にだけマッチするか、改行文字の直後にもマッチするか言語毎に異なるので、注意が必要。
* 「^$」は空文字列もしくは空行にマッチ。
* JavaScript/JScriptでHTMLのテキストノードを扱う場合、いくらソース中で改行がされていても空白文字とされ、1つのブロック要素内のテキストは1行扱いになるので注意。(innerTextを使った時とかは、<br>の前にもマッチしたりするけど…)
* コマンドプロンプトFINDSTRではFINDSTR /Eでも行末にマッチさせることが出来る。
* Vimでは、パターンの最後にしか使えない「$ (ドルマーク)」以外に、パターン中どこでも使用出来る「\_$ (バックスラッシュ・アンダースコア・ドルマーク)」という記法も使える。
* 「$ (ドルマーク)」の正規表現中のエスケープについては後述。
使用可能言語
BRE, ERE, コマンドプロンプトFINDSTR, Bash, Zsh, Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), sed, GNU sed, GNU grep -G, GNU grep -E, GNU grep -P, AWK, Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Lua, Ruby, Java, R, J, Erlang, Racket(#rx, #px), GNU CLISP(REGEXP(BRE, ERE), PCRE), OCaml, Emacs Lisp, Vim, GNU nano, etc.
「\b (バックスラッシュ・小文字ビー)」 単語境界にマッチ
* アンダースコアを含む英数文字(\w, [A-Za-z0-9_])とそれ以外の文字(\W, [^A-Za-z0-9_])のWord Boundary (単語境界 )にマッチ。 e.g. /AB\b/…「AB 」にはマッチするが、「ABC 」、「ABCD 」等にはマッチしない。
* 環境にも依るけど、日本語等の文字ではなくあくまでも英数文字 と非英数文字 との単語境界なのに注意。 e.g. /AB\b/…「ABC 」にはマッチしないが、「ABあ 」にはマッチする。"あい う".match(/.*\b/g)…エラー。マッチしない。
* Tclやgawkでは「\y (バックスラッシュ・小文字ワイ)」とする。「\b」はバックスペースエスケープシーケンス。(元々のAWKでは単語境界へのアンカーはサポートしていない)
* 文字クラスとして「[] (大括弧)」中で使う時の、バックスペースエスケープシーケンスの「\b」と混同しないこと。
使用可能言語
Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), GNU sed, GNU grep -G, GNU grep -E, GNU grep -P, AWK(gawk), Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Ruby, Java, R, J, Erlang, Racket(#px), GNU CLISP(REGEXP(BRE, ERE), PCRE), OCaml, Emacs Lisp, etc.
「\B (バックスラッシュ・大文字ビー)」 単語境界以外にマッチ
* 英数字単語境界「\b」以外にマッチ。 e.g. /AB\B/…「AB 」にはマッチしないが、「ABC 」、「ABCD 」等にはマッチする。
* 環境にも依るけど、日本語等の文字ではなくあくまでも英数文字 の非単語境界 なのに注意。 e.g. alert("あいうえお".match(/.\B/gm).join("-")…「あ-い-う-え-お 」と表示。(JavaScriptの場合)
* Tclでは「\Y (バックスラッシュ・大文字ワイ)」。
* gawkで使用可能だが、元々のAWKではサポートしていない。
使用可能言語
Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), GNU sed, GNU grep -G, GNU grep -E, GNU grep -P, AWK(gawk), Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Ruby, Java, R, J, Erlang, Racket(#px), GNU CLISP(REGEXP(BRE, ERE), PCRE), OCaml, Emacs Lisp, etc.
「\A (バックスラッシュ・大文字エイ)」 文字列の先頭にマッチ
* 文字列の先頭にマッチ。「^ (サーカムフレックス)」と異なり、行頭つまり改行文字の直後にマッチするというわけではない。 e.g. $str = "ABC\nDEF\nGHI"; @mat = ( $str =~ m/\A.+/gm ); $res = join("-", @mat ); print $res ; …「ABC 」と表示。(Perlの場合) cf. $str = "ABC\nDEF\nGHI"; @mat = ( $str =~ m/^.+/gm ); $res = join("-", @mat ); print $res ; …「ABC-DEF-GHI 」と表示。
* Vimでは、「\%^ (バックスラッシュ・パーセント・サーカムフレックス)」が検索対象ファイルの先頭を表す。
使用可能言語
Zsh(--rematchpcre), GNU grep -P, Perl, PHP(mb_ereg, PCRE), 鬼車, .NET, Powershell, Boo, Python, Tcl, Ruby, Java, R, J, Erlang, GNU CLISP(PCRE), Vim, etc.
「\Z (バックスラッシュ・大文字ゼット)」 文字列の末尾にマッチ
* 文字列の末尾にマッチ。「$ (ドル記号)」と異なり、行末つまり改行文字の直前にマッチするというわけではない。 e.g. $str = "ABC\nDEF\nGHI"; @mat = ( $str =~ m/.+\Z/gm ); $res = join("-", @mat ); print $res ; …「GHI 」と表示。(Perlの場合) cf. $str = "ABC\nDEF\nGHI"; @mat = ( $str =~ m/.+$/gm ); $res = join("-", @mat ); print $res ; …「ABC-DEF-GHI 」と表示。
* 但し大抵の処理系で、文字列の末尾が改行文字だった場合、文字列末尾の改行文字の直前にマッチ。
* Vimでは、「\%$ (バックスラッシュ・パーセント・ドルマーク) 」が検索対象ファイルの末尾を表す。
使用可能言語
Zsh(--rematchpcre), GNU grep -P, Perl, PHP(mb_ereg, PCRE), 鬼車, .NET, Powershell, Boo, Python, Tcl, Ruby, Java, R, J, Erlang, GNU CLISP(PCRE), Vim, etc.
「\z (バックスラッシュ・小文字ゼット)」 文字列の末尾にマッチ
* 「\Z」と異なり、文字列の末尾が改行文字でも、文字列末尾にマッチ。
使用可能言語
Zsh(--rematchpcre), GNU grep -P, Perl, PHP(mb_ereg, PCRE), 鬼車, .NET, Powershell, Boo, Ruby, Java, R, Erlang, GNU CLISP(PCRE), etc.
「\G (バックスラッシュ・大文字ジー)」 前回のマッチが成功した位置にマッチ
* グローバルマッチ で、前回のマッチが終了した位置にすぐ続くパターンにマッチ。入力の先頭である場合もマッチ。マッチの開始位置が前回のマッチの終了位置でなければマッチしない。
e.g. print '(1)(3)(5)[7](9)' =~ m/\G\(\d\)/g; …「(1)(3)(5) 」と表示。(Perlの場合。例に挙げたパターンと対象文字列は.NETのリファレンスより) cf. print '(1)(3)(5)[7](9)' =~ m/\(\d\)/g; …「(1)(3)(5)(9) 」と表示。(Perlの場合)
* Perlでは「pos()」関数でマッチ位置を変えられる。 e.g. $_ = '(1)(3)(5)[7](9)'; pos($_) = 12; print $_ =~ m/\G\(\d\)/g; …「(9) 」と表示。 この場合、「pos()」に代入する値が「0. 3. 6. 12 」以外だと一切マッチしない。
* Booの組み込みの正規表現ではサポートしていない模様。(「import System.Text.RegularExpressions」し、.NETの正規表現インスタンスを生成した後なら使用出来る)
使用可能言語
Zsh(--rematchpcre), GNU grep -P, Perl, PHP(mb_ereg, PCRE), 鬼車, .NET, Powershell, (Boo), Ruby(String#scan()), Java, R, J, Erlang, GNU CLISP(PCRE), etc.
「\< (バックスラッシュ・レスザンサイン)」 単語の先頭にマッチ
* ここでの単語とは「\w+」ということらしい。
* gawkで使用可能だが、元々のAWKではサポートしていない。
* Tclでは「\m (バックスラッシュ・小文字エム)」。
使用可能言語
コマンドプロンプトFINDSTR, GNU sed, GNU grep -G, GNU grep -E, AWK(gawk), Tcl, GNU CLISP(REGEXP(BRE, ERE)), Emacs Lisp, Vim, GNU nano, etc.
「\> (バックスラッシュ・グレーターザンサイン)」 単語の末尾にマッチ
* ここでの単語とは「\w+」ということらしい。
* gawkで使用可能だが、元々のAWKではサポートしていない。
* Tclでは「\M (バックスラッシュ・大文字エム)」。
使用可能言語
コマンドプロンプトFINDSTR, GNU sed, GNU grep -G, GNU grep -E, AWK(gawk), Tcl, GNU CLISP(REGEXP(BRE, ERE)), Emacs Lisp, Vim, GNU nano, etc.
「(?=lookaheadpattern ) (小括弧・クエスチョンマーク・イコール)」 肯定先読み
* 「(?=」と「)」の間のlookaheadpattern が後に続く(つまり先読みパターンの直前の)パターンにマッチ。 e.g. alert(str = "ABCDEF".match(/.+(?=DEF)/gm).join("-"));…「ABC 」と表示。(JavaScriptの場合)
* 「(?=」と「)」の間のlookaheadpattern 自体は、マッチするパターンに含まれないので注意。あくまでその直前のパターンにマッチングを行う。
* alert("ABCDEF".match(/(?=CD).+/)は「CDEF 」と表示される。つまり「CD」にマッチするパターン即ち文字列「ABCDEF」中の「CD」の直前、「B」と「C」の間にアンカーが来るから。
* Vimでは「\@= (バックスラッシュ・アトマーク・イコール)」という記法でこの機能をサポート。 e.g. 文字列「ABCDEF 」に対し、:/.\+\(DEF\)\@=…「ABC 」にマッチ。(この場合、「:/.\+DEF\&」とも書ける)
使用可能言語
Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), GNU grep -P, Perl, PHP(mb_ereg, PCRE), 鬼車, .NET, Powershell, Boo, Python, Tcl, Ruby, Java, R, J, Erlang, Racket(#rx, #px), GNU CLISP(PCRE), Vim, etc.
「(?!lookaheadpattern ) (小括弧・クエスチョンマーク・エクスクラメーションマーク)」 否定先読み
* 「(?!」と「)」の間のlookaheadpattern でない パターンがマッチする直前のパターンにマッチ。 e.g. "ABCDEF".match(/ABCD(?!F)/);はマッチするが(ABCD …と表示)、"ABCDEF".match(/ABCDE(?!F)/);はマッチしない。つまり「F」でない パターン即ち「E」の直前にアンカーが来るから。
* また、"ABCDEF".match(/.+(?!F)/);は「ABCDEF 」が表示される。つまり最長に取った「F」でない パターンの直前が文字列末尾となるから。(JavaScriptの場合)
* つまり、文字列"ABCDEF"は、正規表現/A(?!F)/、/AB(?!F)/、/ABC(?!F)/、/ABCD(?!F)/、/ABCDEF(?!F)/にはマッチするが、/ABCDE(?!F)/にはマッチしない。このように所謂greedy なマッチングを行うので、注意が必要。
* Vimでは「\@! (バックスラッシュ・アトマーク・エクスクラメーションマーク)」という記法でこの機能をサポート。 e.g. 文字列「ABCDEF 」に対し、:/ABCD\(F\)\@!…「ABCD 」にマッチ。
使用可能言語
Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), GNU grep -P, Perl, PHP(mb_ereg, PCRE), 鬼車, .NET, Powershell, Boo, Python, Tcl, Ruby, Java, R, J, Erlang, Racket(#rx, #px), GNU CLISP(PCRE), Vim, etc.
「(?<=lookbehindpattern ) (小括弧・クエスチョンマーク・レスザンサイン・イコール)」 肯定後読み
* 「(?<=」と「)」の間のlookbehindpattern の後に続く(つまり後読みパターンの直後の)パターンにマッチ。 e.g. print join("-", ("ABCDEF" =~ m/(?<=ABC).+/gm)); …「DEF 」と表示。(Perlの場合)
* 「(?<=」と「)」の間のlookbehindpattern 自体は、マッチするパターンに含まれないので注意。あくまでその直後のパターンにマッチングを行う。
* print join("-", ("ABCDEF" =~ m/.+(?<=CD)/gm)); は「ABCD 」と表示される。つまり「CD」にマッチするパターン即ち文字列「ABCDEF」中の「CD」の直後、「D」と「E」の間にアンカーが来るから。
* 殆どの処理系で、後読みパターンは固定長でないといけない。迂闊に*、+、?、{m,n}(文字列長が固定される{n}は除く)等を使うと、Variable length lookbehind not implemented (Perlの場合)と処理系に怒られてしまう。
* Vimでは「\@<= (バックスラッシュ・アトマーク・レスザンサイン・イコール)」という記法でこの機能をサポート。 e.g. 文字列「ABCDEF 」に対し、:/\(ABC\)\@<=.\+…「DEF 」にマッチ。
使用可能言語
Zsh(--rematchpcre), GNU grep -P, Perl, PHP(mb_ereg, PCRE), 鬼車, .NET, Powershell, Boo, Python, Ruby, Java, R, J, Erlang, Racket(#rx, #px), GNU CLISP(PCRE), Vim, etc.
「(?<!lookbehindpattern ) (小括弧・クエスチョンマーク・レスザンサイン・エクスクラメーションマーク)」 否定後読み
* 「(?<!」と「)」の間のlookbehindpattern でない パターンがマッチする直後のパターンにマッチ。e.g. print join("-", ("ABCD12AB34" =~ m/(?<!CD)\d{2}/gm));…「34 」と表示。(Perlの場合)
* "ABCDEF" =~ m/(?<!A)ABCDEF/はマッチする。つまり「A」でない 最初のパターン即ち行頭に アンカーが来るから。(Perlの場合)
* Vimでは「\@<! (バックスラッシュ・アトマーク・レスザンサイン・エクスクラメーションマーク)」という記法でこの機能をサポート。 e.g. 文字列「ABCD12AB34 」に対し、:/\(CD\)\@<!\d\{2}…「34 」にマッチ。
使用可能言語
Zsh(--rematchpcre), GNU grep -P, Perl, PHP(mb_ereg, PCRE), 鬼車, .NET, Powershell, Boo, Python, Ruby, Java, R, J, Erlang, Racket(#rx, #px), GNU CLISP(PCRE), Vim, etc.
「\」
* \ (バックスラッシュ・\x5C)
* メタ文字・特殊文字をエスケープするのに使用。
* 「\ (バックスラッシュ)」の文字そのものを正規表現パターンに含める時は、\\のように「\ (バックスラッシュ)」を2つ続けてエスケープするか、\x5Cや\u005cのように符号でエスケープする。
* 「\ (バックスラッシュ)」の文字そのものを大括弧内に入れる時は、大括弧内で「\ (バックスラッシュ)」によるエスケープが効く処理系では「\\」とバックスラッシュを2つ続けてエスケープするか、\x5Cや\u005cのように符号でエスケープする。
「/」
* / (スラッシュ・\x2F)
* 「/ (スラッシュ)」の文字そのものを正規表現パターンに含める時は、\/のように「\ (バックスラッシュ)」でエスケープするか、\x2Fや\u002fのように符号でエスケープする。
* 「[] (大括弧)」の中ではリテラルに「/ (スラッシュ)」文字そのものとして扱われる。
「.」
* . (ピリオド・\x2E)
* 「. (ピリオド)」の文字そのものを正規表現パターンに含める時は、\.のように「\ (バックスラッシュ)」でエスケープするか、\x2Eや\u002eのように符号でエスケープする。 (... URIをまとめて置換する時とか、これを忘れてよくひどい目に遭う…)
* 「[] (大括弧)」の中ではリテラルに「. (ピリオド)」文字そのものとして扱われる。
「[」
* [ (開き大括弧・\x5B)
* 「[ (開き大括弧)」の文字そのものを正規表現パターンに含める時は、\[のように「\ (バックスラッシュ)」でエスケープするか、\x5Bや\u005bのように符号でエスケープする。
* 「[ (開き大括弧)」の文字そのものを大括弧内に入れる時は別にエスケープも大括弧内での位置も気にしなくていいみたい。
「]」
* ] (閉じ大括弧・\x5D)
* 「] (閉じ大括弧)」の文字そのものを正規表現パターンに含める時は、別にエスケープは気にしなくていいみたい。 (...でも怖いからついつい符号でエスケープしちゃうけど…)
* 「] (閉じ大括弧)」の文字そのものを大括弧内に入れる時は、大括弧内の文字列の最初にするか(大括弧内で「\ (バックスラッシュ)」によるエスケープが効く処理系では「\ (バックスラッシュ)」でエスケープも可)、\x5Dや\u005dのように符号でエスケープする(この場合、大括弧内での位置も気にしなくていい)。 e.g. []ABC] or [A\u005dBC]…A・B・Cまたは閉じ大括弧にマッチ。
「-」
* - (ハイフン・\x2D)
* 大抵の処理系で「- (ハイフン)」の文字そのものは正規表現パターンで特にエスケープは考えなくていい。
* 一部処理系で「- (ハイフン)」に別な意味合いが持たされているので(e.g. Lua: 量指定- ⇔ 他処理系の*?)、時にエスケープに気を遣わないといけない。
* 「- (ハイフン)」の文字そのものを大括弧内に入れる時は、大括弧内の文字列の最初か最後にする。(大括弧内で「\ (バックスラッシュ)」によるエスケープが効く処理系では「\ (バックスラッシュ)」でエスケープも可) もしくは\x2Dや\u002dのように符号でエスケープする(この場合、大括弧内での位置も気にしなくていい)。 e.g. [-ABC] or [ABC-] or [A\u002dBC]…A・B・Cまたはハイフンにマッチ。
「&」
* & (アンパサンド・\x26)
* 大抵の処理系で「& (アンパサンド)」の文字そのものは正規表現パターンで特にエスケープは考えなくていい。
* 一部処理系で「& (アンパサンド)」に特別な意味があるので(e.g. sedや、gawkのgensub()関数では、Perlの$& のようにパターンにマッチした文字列を表す)、時にエスケープに気を遣わないといけない。(置換文字列の中で展開されるので、大丈夫と言えば大丈夫だけど…)
* 「[] (大括弧)」の中ではリテラルに「& (アンパサンド)」文字そのものとして扱われる。
「(」
* ( (開き小括弧・\x28)
* 「( (開き小括弧)」の文字そのものを正規表現パターンに含める時は、\(のように「\ (バックスラッシュ)」でエスケープするか、\x28や\u0028のように符号でエスケープする。
* 「[] (大括弧)」の中ではリテラルに「( (開き小括弧)」文字そのものとして扱われる。
「)」
* ) (閉じ小括弧・\x29)
* 「) (閉じ小括弧)」の文字そのものを正規表現パターンに含める時は、\)のように「\ (バックスラッシュ)」でエスケープするか、\x29や\u0029のように符号でエスケープする。
* 「[] (大括弧)」の中ではリテラルに「) (閉じ小括弧)」文字そのものとして扱われる。
「|」
* | (縦線・\x7C)
* 「| (縦線)」の文字そのものを正規表現パターンに含める時は、\|のように「\ (バックスラッシュ)」でエスケープするか\x7Cや\u007cのように符号でエスケープする。 (意外にこの文字をエスケープさせないといけないのを忘れがち…)
* 「[] (大括弧)」の中ではリテラルに「|(縦線)」文字そのものとして扱われる。
「*」
* * (アスタリスク・\x2A)
* 「* (アスタリスク)」の文字そのものを正規表現パターンに含める時は、\*のように「\ (バックスラッシュ)」でエスケープするか、\x2Aや\u002aのように符号でエスケープする。
* 「[] (大括弧)」の中ではリテラルに「*(アスタリスク)」文字そのものとして扱われる。
「+」
* + (プラス・\x2B)
* 「+ (プラス)」の文字そのものを正規表現パターンに含める時は、\+のように「\ (バックスラッシュ)」でエスケープするか、\x2Bや\u002bのように符号でエスケープする。
* 「[] (大括弧)」の中ではリテラルに「+(プラス)」文字そのものとして扱われる。
「?」
* ? (クエスチョンマーク・\x3F)
* 「? (クエスチョンマーク)」の文字そのものを正規表現パターンに含める時は、\?のように「\ (バックスラッシュ)」でエスケープするか、\x3Fや\u003fのように符号でエスケープする。
* 「[] (大括弧)」の中ではリテラルに「?(クエスチョンマーク)」文字そのものとして扱われる。
「{」
* { (開き中括弧・\x7B)
* 「{ (開き中括弧)」の文字そのものを正規表現パターンに含める時は、\{のように「\ (バックスラッシュ)」でエスケープするか、\x7Bや\u007bのように符号でエスケープする。
* 「[] (大括弧)」の中ではリテラルに「{ (開き中括弧)」文字そのものとして扱われる。
「}」
* } (閉じ中括弧・\x7D)
* 「} (閉じ中括弧)」の文字そのものを正規表現パターンに含める時は、別にエスケープは気にしなくていいみたい。 (...でも怖いからついつい符号でエスケープしちゃうけど…)
* 「[] (大括弧)」の中ではリテラルに「} (閉じ中括弧)」文字そのものとして扱われる。
「^」
* ^ (サーカムフレックス・\x5E)
* 「^ (サーカムフレックス)」文字そのものを正規表現パターンに含める時は、\^のように「\ (バックスラッシュ)」でエスケープするか、\x5Eや\u005eのように符号でエスケープする。
* 「^ (サーカムフレックス)」の文字そのものを大括弧内に入れる時は、大括弧内の文字列の最初以外にするか(大括弧内で「\ (バックスラッシュ)」によるエスケープが効く処理系では「\ (バックスラッシュ)」でエスケープも可)、\x5Eや\u005eのように符号でエスケープする(この場合、大括弧内での位置も気にしなくていい)。 e.g. [A^BC] or [A\u005eBC]…A・B・Cまたはサーカムフレックスにマッチ。
「$」
* $ (ドルマーク・\x24)
* 「$ (ドルマーク)」文字そのものを正規表現パターンに含める時は、\$のように「\ (バックスラッシュ)」でエスケープするか、\x24や\u0024のように符号でエスケープする。
* 「[] (大括弧)」の中ではリテラルに「$ (ドルマーク)」文字そのものとして扱われる。
「#」
* # (ハッシュ・\x23)
* 「x」修飾子で挙動変更された正規表現パターンでコメントを導く。
* 「# (ハッシュ)」文字そのものを「x」修飾子で挙動変更された正規表現パターンに含める時は、\#のように「\ (バックスラッシュ)」でエスケープするか、\x23や\u0023のように符号でエスケープする。
* 「x」修飾子で挙動変更されていなければエスケープを考えなくて良い。
* 「[] (大括弧)」の中ではリテラルに「# (ハッシュ)」文字そのものとして扱われる。
「 」
* (半角スペース・\x20)
* 「x」修飾子で挙動変更された正規表現パターンで無視される。
* 「 (半角スペース)」文字そのものを「x」修飾子で挙動変更された正規表現パターンに含める時は、\ のように「\ (バックスラッシュ)」でエスケープするか、\x20や\u0020のように符号でエスケープする。文字集合「\s」を使うのも良い。
* 「x」修飾子で挙動変更されていなければエスケープを考えなくて良い。
* 「[] (大括弧)」の中ではリテラルに「 (半角スペース)」文字そのものとして扱われる。
「%」
* % (パーセント・\x25)
* Luaでメタ文字・特殊文字のエスケープに使用。
* 「% (パーセント)」文字そのものを正規表現パターンに含める時は、%%のようにエスケープする。
* 検索対象文字列内では「\037」と10進3桁符号で表現出来るが、正規表現文字列ではイマイチ意味が無い。(あえて符号で使うにしても、「\037\037」と重ねないといけない)
* 「[] (大括弧)」の中ではリテラルに「% (パーセント)」文字そのものとして扱われる。
「\a」
* BEL (ベル文字・\x07)
「\b」
* BS (バックスペース文字・\x08)
* このエスケープシーケンスは、「[] (大括弧)」中で文字クラスとして使う時のみ。「\b」を正規表現パターンで使うと、AWKやTcl、Vimを除いて殆どの処理系で「単語境界 」。
「\cX」
* Ctrl +[A-Za-z] (コントロール文字・Ctrl キー+何かアルファベット1文字)
* シェルやDOS等のプロンプトで使う^C(Ctrl +C )や^Z(Ctrl +Z )等、Ctrl キーと組み合わせて使う文字。
「\e」
* ESC (エスケープ文字・\x1B)
「\f」
* FF (フォームフィード(改頁)文字・\x0C)
* Vimでは、ファイル名に使用出来る文字を表す文字集合。(補集合は\Fとなる。\Fは処理系によってかなり異なる。CygwinのVimのデフォルト(設定は変えられる)では「\x00-\x1F\x7F !"&'()*:;<>?@[]\^`{}|」。「/ (スラッシュ)」が「\f」に含まれることに注意。設定をカスタマイズした方が良いかも。また、コントロール文字でもASCIIの範囲外の文字は「\f」)
「\n」
* LF (ラインフィード(改行)文字・\x0A)
* 処理系によっては、その環境での改行コードを表す。(Windowsだったら「CRLF」)
「\r」
* CR (キャリッジリターン(復帰)文字・\x0D)
「\t」
* HT (水平タブ文字・\x09)
「\v」
* VT (垂直タブ文字・\x0B)
* Perl・PCRE等一部処理系では、文字列中では「垂直タブ文字」のエスケープシークェンスだけど、正規表現中では「垂直空白 の文字集合」。文字列中の「垂直タブ文字」も「\s」文字クラスから外れている。
* Vimではパターン中で「\W」のASCII文字に特別な意味を与える埋め込みフラグ。
「\0 (バックスラッシュ・ゼロ)」
* NUL (ヌル文字・\x00)
* 「0 (ゼロ・\x30)」文字とは違うので注意。
* Luaでは、通常の文字列内で「\000」、正規表現中で「%z」となる。
「"」
「'」
* " (二重引用符・\x22)
* ' (一重引用符・\x27)
* 大抵の処理系で、どちらも正規表現パターン中、特にエスケープは考えなくていい。
* 但し、パターンを文字列で渡す処理系や、検索対象文字列に引用符が含まれている時は、当たり前だけどエスケープが必要。
* 特にPHPだと、正規表現パターンを文字列として正規表現関係の関数に渡すので、エスケープに注意。「\ (バックスラッシュ)」の文字そのものを検索する時など、「\ (バックスラッシュ)」が4つ続くのでかなり不気味…。(3つでも通ったりするけど…)
(所謂Nowdocを使うのが一番ストレス無い気がする…)
「\・」
* 「\ (バックスラッシュ)」+「何か1文字」 (その文字自身)
* 大抵の処理系で、エスケープシークエンスや特別な意味を持った文字以外に「\ (バックスラッシュ)」を付けると「\ (バックスラッシュ)」が無視されて、その文字自身を表す。
* なのでエスケープが必要かどうか微妙な時に、とりあえず「\ (バックスラッシュ)」を付けておいたりするんだけど…。
* 一部の処理系、例えばDMonkeyとかでは、「\ (バックスラッシュ)」でのエスケープはエスケープが必要な文字にしか効果が無いので、ハマって時間を取られることがしばしば…。符号でエスケープしとけばいいんだけどね…。 e.g. "]".match(/]/)はマッチするけど、"]".match(/\]/)はマッチしない。
「\ooo 」
* 「\ (バックスラッシュ)」+「1〜 3桁の8進数数字 」
* 8進数コードで文字を表現。大抵の処理系で1桁〜 3桁。 e.g. \101…アルファベットの半角大文字「A 」。
* 後方参照と紛らわしくならないように、1・2桁の時は「\ (バックスラッシュ)」の後に「0 (ゼロ)」を付けるのが一般的。 e.g. \077…「? (クエスチョンマーク)」
* 大抵の処理系で000〜 177、即ちASCII文字のみ。
* まぁでも8進数コードの1桁と2桁の大半は制御文字だからあまり後方参照とバッティングしないとは思うけど…。
* Perlでは\o{oooo }形式でUnicode文字を表現可能。
「\xhh 」
* 「\x (バックスラッシュ・小文字エックス)」+「1〜 2桁の16進数数字 」
* 16進数コードで文字を表現。大抵の処理系で1桁〜 2桁。 e.g. \x41…アルファベットの半角大文字「A 」。
* 大抵の処理系で桁数2桁固定なので、1桁の時は頭に0を補う。
* 大抵の処理系で00〜 7F、即ちASCII文字のみ。(「Unicode ラテン文字-1 補助」も表せる時もあるけど、「Shift_JIS(CP932)」環境では半角カタカナとかになってしまう…。Perl以外では、ASCIIの範囲での使用に留めておいた方が無難)
「\uhhhh 」
* 「\u (バックスラッシュ・小文字ユー)」+「4桁の16進数数字 」
* 16進数コードでUnicode文字を表現。大抵の処理系で4桁固定。 e.g. \u0041…アルファベットの半角大文字「A 」。
* Perlでは\x{hhhh }で表す。(Perlでは\uは続くパターンの大文字への変換を表す) e.g. print join("-", ("あいうえお" =~ m/\x{3042}/gm));…「あ 」と表示。(Perlの場合)
* PHPには無い…。代替手段も無い…。(自前でエンコード・デコードする関数を作って利用する手はあるけど…) バイト列に分解すればいいだけだった…。→cf. また、mb_ergであれば、「\x{hhhh }」が使用出来る。
「\ddd 」
* 「\ (バックスラッシュ)」+「3桁の10進数数字 」
* Luaでの文字のコード表現。表現される文字は環境・コードページによる。 e.g. \130\160…Shift_JIS\048\066…Unicode\227\129\130…UTF-8 …いずれもひらがなの「あ 」。
「\N{U+hhhh }」
* 「\N (バックスラッシュ・大文字エヌ)」+「大文字ユー・プラス・4桁の16進数数字 」
* 16進数コードでUnicode文字を表現。i.e. ⇔ \x{hhhh}
e.g. print( ( qq/\x{3042}/ =~ m/\N{U+3042}/ ) . q/-/ . $& ); …「1-あ 」と表示。
* 「U+ (大文字 ユー・プラス)」を付け忘れやすいので注意。小文字のユーは通らない。
* PCREでもサポートされていなくて、Perlオンリー。まぁ一つのことをするのに複数手段が用意されているのがPerlだから…。
「\N{charname }」
* 「\N (バックスラッシュ・大文字エヌ)」+「Unicode文字名 」
* 文字名でUnicode文字を表現。
* 「use charnames」しておかないと使えない。
e.g. use charnames q/:full/; print( ( qq/\x{3042}/ =~ m/\N{HIRAGANA LETTER A}/ ) . q/-/ . $& ); …「1-あ 」と表示。
* しかし、これを使うと何だか重い…。(Unicodeテーブルを参照するから当然か…)
* PCREでもサポートされていなくて、Perlオンリー。まぁ一つのことをするのに複数手段が用意されているのがPerlだから…。
「\d」 10進数字
* 大抵の処理系で、任意の10進数の数字1文字を表す。
* i.e. \d ⇔ [0-9]
* 一部処理系では数字プロパティ(Nd)を持つUnicode文字にもマッチする。
e.g.
( [char] 0x661 ) -Match '\d'…「True 」と表示。(Powershellの場合。U+0661はアラビア語の数字の1「١」)
使用可能言語
Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), GNU grep -P, Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Lua, Ruby, Java, R, Erlang, Racket(#px), GNU CLISP(PCRE), Vim, etc.
「\D」 10進数字以外
* 大抵の処理系で、任意の10進数の数字以外の1文字を表す。
* i.e. \D ⇔ [^0-9]
* 一部処理系では数字プロパティ(Nd)を持つUnicode文字にはマッチしない。
使用可能言語
Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), GNU grep -P, Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Lua, Ruby, Java, R, J, Erlang, Racket(#px), GNU CLISP(PCRE), Vim, etc.
「\w」 英数文字
* 大抵の処理系で、英語アルファベット・10進数の数字・アンダースコアのどれか1文字を表す。
* i.e. \w ⇔ [A-Za-z0-9_]
* 「_ (アンダースコア)」が含まれることに注意。
* Lua、Emacs Lisp等一部処理系では「_ (アンダースコア)」が除外される。(⇔ [:alnum:])
* 言語によっては(.NET FrameworkやPHPでuフラグを指定した時等)、Unicode上での文字・数字全般([Lu]、[Ll]、[Lo]、etc.)にマッチする。
使用可能言語
Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), GNU sed, GNU grep -G, GNU grep -E, GNU grep -P, AWK, Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Lua, Ruby, R, J, Erlang, Racket(#px), GNU CLISP(REGEXP(BRE, ERE), PCRE), Emacs Lisp, Vim, etc.
「\W」 英数文字以外
* 大抵の処理系で、英語アルファベット・10進数の数字・アンダースコア以外の1文字を表す。
* i.e. \W ⇔ [^A-Za-z0-9_]
* 「_ (アンダースコア)」が除外されることに注意。
* Lua、Emacs Lisp等一部処理系では「_ (アンダースコア)」がここに含まれる。
* 言語によっては(.NET FrameworkやPHPでuフラグを指定した時等)、Unicode上での文字・数字全般([Lu]、[Ll]、[Lo]、etc.)以外にマッチする。
使用可能言語
Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), GNU sed, GNU grep -G, GNU grep -E, GNU grep -P, AWK, Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Lua, Ruby, R, J, Erlang, Racket(#px), GNU CLISP(REGEXP(BRE, ERE), PCRE), Emacs Lisp, Vim, etc.
「\s」 空白文字
* 任意の空白文字として扱われる文字(半角スペース・タブ・垂直タブ・CR・LF・フォームフィード)1文字を表す。
* i.e. \s ⇔ [ \t\v\r\n\f]
* 最近のPerl・PCRE等一部処理系では、「\v (垂直タブ)」が含まれなくなっている。
* 一般に全角スペースは含まれない。
* 全角スペースを始め、Unicode上でスペースと看做される文字全てを含む処理系もある。
cf. FireFoxでのJavaScriptの例: \s ⇔ [\t\n\v\f\r \u00a0\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u200b\u2028\u2029\u3000]
* HTMLのコード中では「\s」は空白文字として半角スペース扱いになり、連続した空白文字は1文字分にトリムされる。
* Emacs Lispでは「\\s-」「\\s 」で、ほぼ同じ文字集合を表せる。 e.g. (string-match "\\s-" " ")…「0 」と表示。(i.e. マッチ) …水平タブの入力は「Ctrl + Q Tab 」。
使用可能言語
Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), GNU sed, GNU grep -G, GNU grep -E, GNU grep -P, AWK, Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Lua, Ruby, Java, R, J, Erlang, Racket(#px), GNU CLISP(REGEXP(BRE, ERE), PCRE), (Emacs Lisp), Vim, etc.
「\S」 空白文字以外
* 空白文字として扱われる文字以外の1文字を表す。
* i.e. \S ⇔ [^\s]
* Emacs Lispでは「\\S-」「\\S 」で、ほぼ同じ文字集合を表せる。
使用可能言語
Zsh(--rematchpcre), ECMAScript(JavaScript, JScript, DMonkey, DMDScript, etc.), GNU sed, GNU grep -G, GNU grep -E, GNU grep -P, AWK, Perl, PHP(mb_ereg, PCRE), 鬼車, VBS, .NET, Powershell, Boo, Python, Tcl, Lua, Ruby, Java, R, J, Erlang, Racket(#px), GNU CLISP(REGEXP(BRE, ERE), PCRE), Emacs Lisp, Vim, etc.
「\h」「\H」「\v」「\V」 水平・垂直空白文字
* Perl・PCRE等の処理系で
「\h (水平空白)」⇔「[\t\p{Zs}]」i.e. 水平タブ文字と<USP> (Unicodeでスペースプロパティを持つ文字)。
「\H (水平空白以外)」⇔「[^\h]」i.e. 「\h」の補集合。
「\v (垂直空白)」⇔「[\x09-\x0d\x{0085}\x{2028}\x{2029}]」i.e. 垂直タブと改行文字・行終端文字(NEL ・LSEP ・PSEP )。
「\V (垂直空白以外)」⇔「[^\V]」i.e. 「\v」の補集合。
* しかし、「\v」は垂直タブ文字のエスケープシークェンスと紛らわしいし、また、「\h」「\H」はRubyやPHP(mb_ereg)等の鬼車では「16進数字 (⇔ [0-9a-fA-F] ⇔ [[:xdigit:]])」及びその補集合を表すので、これらの文字集合を使う時は非常に注意が必要。
「\p{name }」 「name 」で指定された文字クラスに属するUnicode文字
* 「name 」で指定されたUnicodeプロパティを持つか、Unicodeブロックに属する、Unicode文字を表す。
e.g. print 'あ' =~ m/\p{Lo}/; …「1 」と表示、即ちマッチ。(Perlの場合)
print 'あ' =~ m/\p{Hiragana}/; …「1 」と表示、即ちマッチ。(Perlの場合)
* 「name 」で指定するのがUnicodeブロックの場合、処理系によってはブロック名の前に「Is」というプレフィックス(Javaだと「In」)を付けないといけない。(Perlはどちらでも良いみたい)
e.g. "あ" -Match '\p{IsHiragana}'…「True 」と表示。(Powershellの場合)
* Jでは標準でこの機能はサポートされていない(みたい)。どこからか「pcre3.dll 」を持って来て、Jで普段利用している「jpcre.dll 」と置き換えたら、この表現が利用可能になる。(J自体はUnicodeをサポートしているが、Jの正規表現は…。動詞「rxutf8」「rxutf8_jregex_ 0」等、色々とこねくりまわさないといけない。ASCIIの範囲外も、「u: 16bff」までと思った方がいいかも…。そもそも仕様書がきっちり網羅していなくて、「やってみろ、そして解れっ! 」って感じだもんなぁ… )
* Emacs Lispでは、「\\c… (バックスラッシュ・バックスラッシュ・小文字シー)」の構文で似たような機能を提供している。使えるカテゴリーは「Alt + X →describe-categories」と入力すると確認出来る。 e.g. 「\\ca (ASCII)」「\\cj (日本語)」「\\cH (ひらがな)」…, etc.
使用可能言語
Zsh(--rematchpcre), GNU grep -P, Perl, PHP(mb_ereg, PCRE), 鬼車, .NET, Powershell, Boo, Ruby, Java, R, (J), Erlang, Racket(#px), GNU CLISP(PCRE), (Emacs Lisp), etc.
「\P{name }」 「name 」で指定された文字クラスに属するUnicode文字以外
* 「name 」で指定されたUnicodeプロパティを持つかUnicodeブロックに属するUnicode文字以外 を表す。
e.g. print 'あ' =~ m/\P{Lu}/; …「1 」と表示、即ちマッチ。(Perlの場合)
print 'あ' =~ m/\P{Greek}/; …「1 」と表示、即ちマッチ。(Perlの場合)
* Emacs Lispでは、「\\C… (バックスラッシュ・バックスラッシュ・大文字シー)」の構文で似たような機能を提供している。
使用可能言語
Zsh(--rematchpcre), GNU grep -P, Perl, PHP(mb_ereg, PCRE), 鬼車, .NET, Powershell, Boo, Ruby, Java, R, (J), Erlang, Racket(#px), GNU CLISP(PCRE), (Emacs Lisp), etc.
「POSIX Character Classes 」
* 「[ ] (大括弧)」の中で「[:class :] (大括弧・コロン・クラス名・コロン・大括弧)」の形で使用。 e.g. [[:upper :][:lower :]] = [[:alpha :]] = [A-Za-z]
* BRE・EREで定義されている文字集合
* Luaでは、「%a」の形で「[:blank:]」「[:print:]」以外をサポート。
使用可能言語
BRE, ERE, Bash, Zsh, Zsh(--rematchpcre), GNU sed, GNU grep -G, GNU grep -E, GNU grep -P, AWK(gawk), Perl, PHP(mb_ereg, PCRE), 鬼車, Tcl, (Lua), Ruby, Java, R, J, Erlang, Racket(#px), GNU CLISP(REGEXP(BRE, ERE), PCRE), Emacs Lisp, Vim, GNU nano, etc.
* 一部処理系での拡張
* Javaでは、「\p{Classname } (頭字は大文字)」の形式で、「[:word:]」以外をサポート。
* Emacs Lispでは更に拡張され、「[:nonascii :] (ASCII文字以外)」「[:unibyte :] (1byte文字)」「[:multibyte :] (マルチバイト文字)」が使える。
* Vimの拡張は、「[:return:] (CR ⇔ \r)」「[:tab:] (HT ⇔ \t)」「[:escape:] (ESC ⇔ \e)」「[:backspace:] (BS ⇔ \b)」。
使用可能言語
Zsh(--rematchpcre), GNU grep -P, Perl, PHP((mb_ereg), PCRE), 鬼車, Ruby, (Java), R, J, Erlang, Racket(#px), GNU CLISP(PCRE), Emacs Lisp, Vim, etc.
「[\u3041-\u3096]」
* Unicodeでのひらがな の範囲。([ぁ-ゖ] 小さい「あ」から小さい「け」まで)
* Unicodeプロパティを使えるならば、「\p{Hiragana}」で一発。
「[\u30a1-\u30fa]」
* Unicodeでのカタカナ の範囲。([ァ-ヺ] 小さい「ア」から「ヲに濁点」まで)
* Unicodeプロパティを使えるならば、「\p{Katakana}」で一発。
「[亜-熙]」
* Shift JISでの漢字範囲。(「亜 (\x889F)」「熙 (\xEAA4)」)
* 大抵Unicodeが問題になるのであまり使わない。
「[\u4e00-\u9fa5]」
* 一般的に簡便で且つよく使われるUnicodeでの漢字範囲指定。([一-龥])
* 但し、漏れがあるのであまり勧められないらしい…。
(?:[\u3005\u3007\u303b\u3400-\u9FFF\uF900-\uFAFF]|[\uD840-\uD87F][\uDC00-\uDFFF])
* Unicodeでの網羅的な漢字範囲。
cf. ものかの ≫ Unicodeで「漢字」の正規表現
* Unicodeプロパティが使えるならば、「\p{Han}」で一発なんだけどな…。