正規表現
Contents
正規表現(regular expression) とは、文字列を一般化して表記する手法。
素晴らしいのは、ルールが世界共通。(なんだろうな)
よほど古いものでない限り、どの言語でも同じルール を用いる。(んだろうな)
(何々言語では、何々は使えないよ~ という情報があればぜひコメントに。。。)
だからこそ、覚えていて損はない どころか 覚えないといけない。
そういうわけで、やろうやろうと思いつつ放置していた 正規表現 まとめに
重い腰を上げてみる。
Dan’s Tools:Regex Pal
→一番軽くてよさそう
RegExr:Learn, Build, & Test RegEx v3.1
→素晴らしい。色々と機能があって、メニューから選べる。Cookie が無効だと利用できない
regex101.com:Online regex tester and debugger: PHP, PCRE, Python, Golang and JavaScript
→初っ端のロード時間が長いけど、素晴らしい!。Cookie が無効だと利用できない
REGEXPER
→パターンを入力して [Display]。構文が間違っていれば赤くなって、修正箇所を ^ で示してくれる。合っていれば、図解してくれる
Regulex:JavaScript Regular Expression Visualizer.
→UI は一番好き。オプションにも対応。図解を画像で保存したり、自サイトへ埋め込めるように iframe タグを発行してくれる。エラー検知がないのが残念
全て半角文字。
特殊文字 | 意味 |
---|---|
^ | 行頭 |
$ | 行末 |
. | 任意の一文字 |
[ ] | 括弧内のいずれかの一文字 |
[^ ] | 括弧内のいずれかの一文字以外 |
| | OR |
* | 直前の一文字の0回以上の繰り返し |
+ | 直前の一文字の1回以上の繰り返し |
? | 直前の一文字の0回または1回(2回以上はNG) |
( ) | グルーピング 選択制御文字 | の適用範囲を限定する場合 繰り返し制御文字の適用範囲を指定する場合 後方参照を使用する場合 |
\ | エスケープキャラクタ |
正規表現パターンの中で特別な意味を持つ一連の文字を メタシーケンス という。
サイトによって載っている情報に過不足がある ので、言語依存のものもありそう。
メタシーケンス | 意味 |
---|---|
\<oct> | |
\x<hex> | |
{n} | 直前の文字の繰り返し回数 n 回 |
{n,} | 直前の文字の繰り返し回数 n 回以上 |
{m,n} | 直前の文字の繰り返し回数 m 回以上 n 回以下 |
\a | ベル (\x07) |
\A | 文の先頭 |
\b | バックスペース (\x08)、単語境界 |
\B | 単語境界以外 |
\d | 数字 |
\D | 数字以外 |
\e | esc |
\f | フォームフィード(改ページ) (\x0C) |
\G | 前にm//gが起きた |
\n | 改行 (\x0A) |
\r | キャリッジリターン (\x0D) |
\s | タブ、スペース、改行(\t、 、\f、\r、\n) |
\S | タブ、スペース、改行以外 |
\t | タブ (\x09) |
\unnnn | 16 進数 nnnn で指定される文字コードを持つ Unicode 文字にマッチ |
\v | 垂直タブ (\x0B) |
\w | 英単語アンダーバー([0-9a-zA-Z_]) |
\W | 英単語アンダーバー以外([^0-9a-zA-Z_]) |
\\xnn | 16 進数 nn で指定される文字コードを持つ ASCII 文字にマッチ |
\z | EOF(End Of File) 記号 (\x1A) |
\< | 英単語の始まりにマッチ(文字ではない) |
\> | 英単語の終わりにマッチ(文字ではない) |
\<char> | 上記以外の文字の場合は (メタキャラクタのエスケープに使用) |
表記 | 意味 | 例 | ヒット対象 |
---|---|---|---|
.* | 複数. が続く | .*A.* | BBBBABB、BBBBA、ABBB、A等 |
c* | cの文字が続く | c*A | ccccA、ccA、cA、A等 |
c+ | cの文字が1文字以上 | c+A | cA、cccA等。Aはダメ |
.+ | 空白以外 | A.+ | ABCD、AAA、AE等。A BCD、A AA、A等はダメ |
c? | cの文字が1文字、もしくは無し | MAC ?OS | MACOS、MAC OS |
c|d(or記号) | cかdどちらか | (A|B)C | AC、BC |
(c|d)? | cかdどちらか、もしくは無し | (A|B)?C | AC、BC、C |
表記 | 意味 | 例 | ヒット対象 |
[cde] | []内のどれか一つ | [cde]A | cA、dA、eA |
[0-9A-Za-z] | 数字とアルファベット | [0-9A-Za-z] | 0、5、e、H、U等 |
[]cde] | cde]の内どれか | []cde]A | ]A、cA、dA、eA |
[.*] | .か*文字 | A[.*]B | A.B、A*B |
[^0-9] | 0-9以外 | [^0-9a-z]A | AA、BA、_A、 A等。5A、bA、yA等はダメ |
表記 | 意味 | 例 | ヒット対象 |
^c | 先頭がc | ^AC | ACbcd、ACEFG、AC260等 |
^[0-9][0-9] | 先頭が00~99 | ^[0-9][0-9] | 00ABGT、48tgh、917、1747等 |
c$ | 最後がc | AC$ | 1560AC、gaACAC、BVFAC等 |
^$ | 空 | ^$ | 空のみ |
^.*$ | 全ての文 | ^.*$ | 何でも良い |
表記 | 意味 | 例 | ヒット対象 |
c\{n\} | cがn文字続く | A\{3\} | AAA |
c\{n,\} | cがn文字以上続く | A\{3,\} | AAA、AAAAA、AAAAAAA等 |
c\{n,m\} | cがn回からm回 | A\{3,4\} | AAA、AAAA |
表記 | 意味 | 例 | ヒット対象 |
[ぁ-ん一-龠ァ-ヾー] | 日本語全角記号以外 | ||
[ア-ン゙゚ァ-ォャ-ョー。「」、] | 日本語半角カタカナ |
表記 | 意味 |
---|---|
<[^>]*> | HTML, XML 等のタグに有効 |
<[^>]* /> | |
</[^>]*> | |
<!–(.|\n)*–> | |
[A-Za-z]+ | 英単語に有効 |
/\*/?(\n|[^/]|[^*]/)*\*/ | 2行まで(?)のコメントにマッチ |
表記 | ([0-9a-zA-Z]+[-._+&])*[0-9a-zA-Z]+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,6} |
---|---|
意味 | メールアドレス |
キャラクタクラス とは、上記メタキャラクタを利用して、全文字の中から選り出した任意の文字集合 のこと。 (っぽい)
「任意の一文字」を一般化しようとすれば . という正規表現になる。
「a か b か k か z の中の1文字」であれば、[abkz] となる。
ところが、「任意の半角アルファベット一文字」を一般化しようとすると
[ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz] となる。
これだと大変なので、便利な機能があり、[A-Za-z] とすることで代替できる。
(ここから・・・昔の記憶を辿って書いたので不確か・・・
ちなみにこの範囲抽出の方法は A-Z という表記はしているけれども
実際には A の文字コードから Z の文字コードまで という意味で
A から Z までは、文字コードが連番で付いているから成せる技。
だから逆に言うと A-z という指定は不可。
・・・ここまで)
[A-Za-z]+ これで、全ての英単語を検索可能。
代表的な連番キャラクタクラス
キャラクタクラス | 意味 |
---|---|
[0-9] | 半角の数字にマッチ |
[^0-9] | 半角の数字以外にマッチ。以下同様 |
[a-z] | 半角のアルファベット小文字にマッチ |
[A-Z] | 半角のアルファベット大文字にマッチ |
[ぁ-ん] | 全角ひらがなにマッチ |
[ァ-ヶ] | 全角カタカナにマッチ |
[ -~] | 任意の1バイト文字(半角空白” “から”~”まで)にマッチ |
[亜-黑] | 漢字にマッチ (詳細は●漢字だけを探したい を参照) |
グルーピング とは、複数の文字(つまり文字列)をワンセットにすること。
ここでの例は、参考サイトの例があまりにも楽しかったので、そのまま拝借することにした。
「うひうひひうひうひひひひひ」
という妖しい文字列。 😎
「うひ+うひ+うひ+うひ+」
ひとまずこれで正規表現ができた。(自信はないけど。。。)
でも、これだと「うひ+」の繰り返しが4回と固定。
これを「(うひ+)+」とすることで 「うひ+」というグループの繰り返し という意味になる。
正規表現における 変数 っていう感じ。
後方から前方を参照する。
前方にて ( ) で括ってある(グルーピングしてある)エスケープシーケンスを
後方にて代替する。
検索のときは \ (バックスラッシュ、円マーク)
\1 ~ \99 まで使用可能。
- var pattern:RegExp = /(\d+)-by-\1/;
- // matches the following: 48-by-48
置換のときは $ (ドルマーク)
$1 ~ $99 まで使用可能。
- var pattern:RegExp = /Hi, (\w+)\./;
- var str:String = "Hi, Bob.";
- trace(str.replace(pattern, "$1, hello."));
- // output: Bob, hello.
- $x = '0173123456';
- $x =~ s/(\d\d\d\d)(\d\d)(\d\d\d\d)/$1-$2-$3/;
- print $x;
- // 0173-12-3456
フラグ | プロパティ | 説明 |
---|---|---|
g | global | 複数箇所に一致 |
i | ignoreCase | 一致の判定において大文字と小文字を区別しない A ~ Z および a ~ z の文字に適用されるが、É や é などの拡張文字には適用されない |
m | multiline | このフラグを設定した場合、$ および ^ はそれぞれ行末と行頭にも一致 |
s | dotall | このフラグを設定した場合、.(ドット)は改行文字(¥n)にも一致 |
x | extended | 正規表現の拡張機能を有効にする パターンの一部と見なされない空白を正規表現の中に挿入できるようになる これにより、正規表現コードの読みやすさが向上 |
- var re:RegExp = /abc/gimsx;
書式は上記のように / の後ろに付加。
併用可。
正規表現では、与えられたパターンにマッチする 最も長い文字列 が検索結果になる。
という文字列に対して、「な~にい+」という正規表現を用いた場合、検索結果としては
「な~にい」「な~にいい」「な~にいいい」「な~にいいいい」「な~にいいいいい」のうちどれがかかるのか。
最長一致 なので、一番長い「な~にいいいいい」が結果として出てくる。
- $_SESSION['name'] = $row['name'];
- \$_SESSION\['(.+)'\] = \$row\[
Flash 用 ActionScript 3.0 のプログラミング:正規表現の使用