負けてたまるか。

脳トレ、プログラミング、PHP、WEB製作などのメモ

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
--.--.-- --:-- | スポンサー広告 | トラックバック(-) | コメント(-) | Edit


正規表現とは?
  • 英語の読みはRegular Expression。(略してRE)
  • 正規表現とは、キーワードを検索したり、置換するときに使う検索の方法です。
  • 非常に柔軟性が高い検索能力が特徴です。
  • エディターの中でも、秀丸エディタやK2EditorなどのRE対応のエディターが大人気だとか
使い方


原文 フリーザ「このフリーザは変身するたびに偏差値がはるかに増す
その変身をオレはあと2回も残している
その意味がわかるな?」
正規表現 フリーザ
マッチする文字列 フリーザ「このフリーザは変身するたびに偏差値がはるかに増す
その変身をオレはあと2回も残している
その意味がわかるな?」
  • 普通の文字はその文字自身にマッチします。(文字列も同じ)
  • たとえば「フリーザ」という正規表現は、「フリーザ」という文字列にマッチします。

原文 ベジータ「俺が…俺が…クラス1
なんだーーーー!!!
くたばれフリーザーーーー!!」
正規表現 \n
マッチする文字列 ベジータ「俺が…俺が…クラス1{改行}
なんだーーーー!!!{改行}
くたばれフリーザーーーー!!」
  • \n は改行を表します。したがって、改行のみにマッチします。
  • ※改行は目に見えるものではありませんが、ここでは改行を{改行}として表現しました。

原文 悟空「みんな・・・オラ(悟空)に少しだけ答えをみせてくれ・・・!」
正規表現 ^悟空
マッチする文字列 悟空「みんな・・・オラ(悟空)に少しだけ答えをみせてくれ・・・!」
  • ^ は先頭の文字列のみにマッチします。オラ(悟空)の「悟空」にはマッチしません。

原文 ピッコロ「くそったれ!!数学がてめえなら歴史はオレだ!!!一生かかっても追いつけんぞ!!!」
フリーザ「これは、これは、おひさしぶり…」
正規表現 .*なら
マッチする文字列 ピッコロ「くそったれ!!数学がてめえなら歴史はオレだ!!!一生かかっても追いつけんぞ!!!」
フリーザ「これは、これは、おひさしぶり…」
  • .(ピリオド)はどのような1文字にでもマッチします。ただし、改行はマッチしません。
  • マッチする文字の例
  • あ、い、E、9、漢、三
  • *(アスタリスク)は直前の文字と0回以上マッチします。
  • たとえば、z* という正規表現は z にも、zzz にもマッチするし、zzzzzzzzzz にもマッチします。
  • .*ならは、「て」と「なら」の間に文字が0文字以上ある文字列がマッチします。
  • マッチする文字の例
  • て4546なら、てなら、てクノラティなら

原文 ギニュー「俺の見立てでは俺の偏差値は60までは上がるはずだ…」
悟空「…センターリサーチ…」
ギニュー「61…60…ご…59…58…バカな…まだ下がっていく!」
ギニュー「じゅ…18!?」
正規表現 [0-9]
マッチする文字列 ギニュー「俺の見立てでは俺の偏差値は60までは上がるはずだ…」
悟空「…センターリサーチ…」
ギニュー「6160…ご…5958…バカな…まだ下がっていく!」
ギニュー「じゅ…18!?」
  • 0~9までの数字にマッチします。
  • [ ]とは文字セットといいます。角かっこで囲まれた文字の中のいずれかと一致します。
  • たとえば、[abc]は、 dragon の a とマッチします。
  • [0123][ABC][あ-ん][0-9A-Za-z][.+~_0-9]のように、文字コードの小さいほうから大きいほうへ書きます。したがって、[dragon][edcba]と書くことはできません。
  • [ ] の中に [] のカッコを入れる場合は[][123] のように [ の直後に ][ を置きます。

原文 フリーザ『「思っていたよりずっと賢いようだね。ちょっと驚いたよ…赤ペン先生の
上をゆく奴がこの世にいたなんてね…でも、僕にはかなわない」
正規表現 [^あ-ん]
マッチする文字列 フリーザ『「思っていたよりずっといようだねちょっといたよ…赤ペン先生
をゆくがこのにいたなんてねでも、僕にはかなわない
  • 「あ」から「ん」以外の文字..つまり、ひらがな以外の文字にマッチします。
  • [ ] の中の先頭に ^ を入れることを否定の文字セットといいます。角カッコに囲まれた文字以外にマッチします。
  • [ab^] これは先ほどの否定の文字セットとは違い、 a,b,^ にマッチするという意味になります。
  • つまり、 ^ が先頭に無ければ、普通の文字として扱うということです。

原文 フリーザ「リアさん!ドリアさん!ドドリアさん!見て御覧なさい!!哀れな不合格者ですよ!!」
ベジータ「ここからが本当の受験だ・・・」
悟空「おめぇ、ココおかしいんじゃねぇか?」
正規表現 ド+リア
マッチする文字列 フリーザ「リアさん!ドリアさん!ドドリアさん!見て御覧なさい!!哀れな不合格者ですよ!!」
ベジータ「ここからが本当の受験だ・・・」
悟空「おめぇ、ココおかしいんじゃねぇか?」
  • 直前の文字の1文字以上の連続にマッチします。
  • たとえば、[ヤム+チャ]という正規表現は、ヤムチャヤムムチャヤムムムムムムチャにマッチします。
  • ただ、 +(プラス) は1文字以上の連続なので、ヤチャにはマッチしません。
  • 0文字以上の連続を表す記号 *(アスタリスク)を使って、 [ヤム*チャ] とすれば、ヤチャでもマッチします。

原文 ベジええタ「不老不死にさええなれえええばいくらでも浪人できえる。いつかフリーザの野郎を倒すことができえええるはずだええ」
正規表現 {2}
マッチする文字列 ベジええタ「不老不死にさええなれえええばいくらでも浪人できえる。いつかフリーザの野郎を倒すことができえええるはずだええ
  • {2} は直前の文字が2個連続したときにマッチします。
  • この場合はえ{2} なので、ええにマッチします。
  • え{3} にすると、えええにマッチします。

原文 「いまのは 難しかったたたたたたああ 難しかったたぞおおお━━━━━━━━━━━━━━━っ!!!!」
正規表現 [おたは]{3,4}
マッチする文字列 「いまのは 難しかったたたたたたああ 難しかったたぞおおお━━━━━━━━━━━━━━━っ!!!!」
  • 「お」「た」「は」のいずれかの文字が3~4個連続した文字列にマッチします。
  • したがって、「いまのは」の「は」にはマッチしませんし、「たたたたたた」の最後の「たた」にはマッチしません。

原文 ベジータ「なにが勉ア強だ…わらわせやがるぜ 教科書を出して勉アユ強 ただページをペラペラめくる勉強ってのがきさまの勉ユ強だったとはな!」
正規表現 .?
マッチする文字列 ベジータ「なにが勉ア強だ…わらわせやがるぜ 教科書を出して勉アユ強 ただページをペラペラめくる勉強ってのがきさまの勉ユ強だったとはな!」
  • ?(クエスチョン)は直前の文字が0~1回連続している文字列にマッチします。
  • .(ピリオド)はどのような1文字にでもマッチします。ただし、改行はマッチしません。
  • .?(ピリオドクエスチョン)は、勉強もしくは、「勉」と「強」の文字の間に1文字あってもマッチするという正規表現です。つまり、勉ア強でも勉ユ強でもマッチします。
  • 勉アユ強は間に2文字あるのでマッチしません。

例1 あなたは 地球人にしては やりますね
例2 あなたは やりますね 地球人にしては
例3 やりますね あなたは 地球人にしては
正規表現 やりますね$
マッチする文字列 あなたは 地球人にしては やりますね
  あなたは やりますね 地球人にしては
  やりますね あなたは 地球人にしては
  • $(ドル)は行の最後にその文字列があればマッチする正規表現です。
  • やりますね$ は行の最後に「やりますね」があればマッチします。
  • したがって、行の最後に「やりますね」が無い場合はマッチしません。
  • 「あなたは やりますね 地球人にしては」 ← マッチしません

原文 「社会!」
「国語!」
「理科!」
「数学!」
「英語!」
「五教科揃って主要五教科!」
正規表現 理科|数学|
マッチする文字列 「社会!」
「国語!」
理科!」
数学!」
「英語!」
教科揃って主要教科!」
  • | (たてぼう) で区切られた文字の、いずれかが含まれている場合にマッチします。
  • 理科|数学| の場合は、理科、数学、五にマッチします。

例1 そうだ!わたしはこの左脳だけで解いてあげましょう
例2 そうだ!ぼくはこの左脳だけで解いてあげましょう
例3 そうだ!ぼくわたしはこの左脳だけで解いてあげましょう
正規表現 そうだ!(ぼく|わたし)
マッチする文字列 そうだ!わたしはこの左脳だけで解いてあげましょう
  そうだ!ぼくはこの左脳だけで解いてあげましょう
  そうだ!ぼくわたしはこの左脳だけで解いてあげましょう
  • そうだ!(ぼく|わたし) ← 「そうだ!ぼくは」または「そうだ!わたしは」にマッチします。
  • そうだ!ぼくわたしは」にはマッチしません。

Wikipediaから抜粋

伝統的な UNIX の正規表現

この文法では、ほとんどの文字はリテラルに扱われる。つまり、ある文字はその文字にのみマッチする。例えば、"a" は a にマッチし、"(bc" は (bc にマッチするなど。例外はメタ文字と呼ばれる。

. 任意の文字にマッチする。
[ ] 括弧内に含まれる一文字にマッチする。例えば、[abc] は abc にマッチする。英語のアルファベットでは、[a-z] は全ての小文字にマッチする。これらは混ぜることが出来る。[abcq-z] は abcqrstuvwxyz にマッチし、[a-cq-z]でも同様である。文字 '-' は括弧内の最初か最後にあるときのみ、リテラルに扱われる。例えば、[abc-] や [-abc]。[] にマッチさせる最も手っ取り早い方法は、囲んでいる括弧内で、括弧が最初になるようにすることである。例えば、[][ab] は ][ab にマッチする。
[^ ] 括弧内に含まれない一文字にマッチする。例えば、[^abc] は abc 以外の任意の文字にマッチする。[^a-z] は小文字以外の任意の一文字にマッチする。上と同様にこれらは混ぜることが出来る。
^ 行の最初にマッチする。
$ 行の最後にマッチする。
\( \) これに囲まれた表現は、後に呼び出すことが出来る。次の \n の項を参照のこと。
\n ここで n は1から9までの数である。n 番目の \( \) で囲まれた部分にマッチする。この構文は理論的には不正で(正則文法の記述力を超える)、拡張正規表現では採用されていない。
*
  • 一文字に続く "*" は0回以上の表現の繰り返しにマッチする。例えば、"[xyz]*" は ""、"x"、"y"、"zx"、"zyx" などにマッチする。
  • n を1から9までの数字としたとき、\n* は \( \) で囲まれた部分の0回以上の繰り返しにマッチする。例えば、"\(a.\)c\1*" は abcababcabab にマッチするが、abcac にマッチしない。
  • "\(" や "\)" で囲まれた表現に続く "*" は無効とされる。しかし、一部の環境ではそうならない。
\{x,y\} 直前の"ブロック"の x 回以上 y 回以下の繰り返しにマッチする。例えば、"a\{3,5\}" は aaaaaaaaaaaa にマッチする。

特定の正規表現の実装では、一部のメタ文字の前のバックスラッシュを異なって解釈する。例えば egrep や perl は、バックスラッシュの付いていない 括弧や縦棒 "|" をメタ文字と解釈し、バックスラッシュの付いているものをリテラルに解釈する。古いバージョンの grep は選言演算子 "|" をサポートしていない。

".at" は hatcatbat のような三文字の文字列にマッチする
"[hc]at" は hatcat にマッチする
"[^b]at" は bat 以外の ".at" でマッチする全ての文字列にマッチする
"^[hc]at" は行の最初にあるときだけ、hatcat にマッチする
"[hc]at$" は行の最後にあるときだけ、hatcat にマッチする

文字列の範囲はロケールに依存する。例えば、エストニア語のアルファベットでは、s の後に z があり、その後は t、u、v、w、x、y と続くので、[a-z] ではすべての小文字のアルファベットにマッチしない[1]。そのため、POSIX 標準では次の表に示されているクラス、つまり文字の区分を定義している。

POSIX クラス 対応する表現 意味
[:upper:] [A-Z] 大文字
[:lower:] [a-z] 小文字
[:alpha:] [A-Za-z] アルファベット
[:alnum:] [A-Za-z0-9] 数字とアルファベット
[:digit:] [0-9] 数字
[:xdigit:] [0-9A-Fa-f] 16進数
[:punct:] [.,!?:...] 句読点
[:blank:] [ \t] スペースとタブ
[:space:] [ \t\n\r\f\v] 空白文字
[:cntrl:] 制御文字
[:graph:] [^ \t\n\r\f\v] 印字文字
[:print:] [^\t\n\r\f\v] 印字文字とスペース

例: [[:upper:]ab] は大文字と ab のみにマッチする。

いくつかのツールで使用できる、POSIX にないクラスとして [:word:] がある。[:word:] は通常 [:alnum:] とアンダースコアからなる。これらが多くのプログラミング言語識別子として使用できる文字であることを反映している。

[編集] POSIX の拡張正規表現

より現代的な拡張正規表現は多くの場合、現在の UNIX のユーティリティでコマンドラインオプションに "-E" を含めることで使用できる。

POSIX の拡張正規表現は伝統的な UNIX の正規表現に似ているが、いくつかの点で異なっている。

メタ文字 "+"、"?"、"|" が追加されている。また、バックスラッシュが削除されて、\{...\} は {...} になり、\(...\) は (...) になる。

"("、")"、"["、"]"、"."、"*"、"?"、"+"、"^"、"$" といった文字は特別な記号として使用されるので、リテラルに使いたいときはエスケープしなければならない。エスケープするには、それらの前に '\' を付ける。例えば、"a\.(\(|\))" は a.)a.( にマッチする。

[編集] Perl 互換正規表現 (PCRE)

PerlPOSIX の拡張正規表現さえも上回る豊富な文法を持っている。その例として、POSIX とは異なり、Perl では最長マッチを行うか指定できることが挙げられる。例えば、パターン "a.*b" では .* はできるだけ長い文字列にマッチさせようとするが、パターン "a.*?b" ではできるだけ短い文字列にマッチさせようとする。だから "a bad dab" に対しては、前者のパターンでは文字列全体にマッチし、後者のパターンでは "a b" にだけマッチする。

また、Perl には以下の定義済み文字クラスがある。

\d 数字 [0-9]
\D 数字以外の文字、つまり [^\d]
\w アルファベット、数字またはアンダーバー、つまり [a-zA-Z_0-9] (ロケールに依存し、例えばウムラウト付き文字などの扱いが変わる)
\W アルファベット、数字やアンダーバー以外の文字、つまり [^\w]
\s 空白文字、つまり大抵の制御文字クラス \f、\n、\r、\t や \v
\S 空白文字以外の文字 [^\s]

このように Perl の正規表現が優れているため、多くの他のプログラミング言語やユーティリティなどで Perl の正規表現に非常によく似た文法を採用している。例えば、Java の Pattern クラス、PythonRuby などがそうである。しかし、これらが Perl の正規表現と完全に互換である訳ではない。

[編集] 正規表現ライブラリ

言語的に、正規表現をサポートしていない場合においても、正規表現に必要な処理を提供する「正規表現ライブラリ」を導入することで正規表現を使うことができる。有名な正規表現ライブラリには「鬼車(おにぐるま)」がある。なお、鬼車は、Rubyの1.9系列やPHPの5系列に採用されている。

[編集] 形式言語理論における正規表現

アルファベット A = {a1,...,an} 上の正規表現は次のように定義される。正規表現の表す集合が、その正規表現の表す言語である。

  • ∅ は正規表現である。これは空集合 ∅ を表す。
  • aiA の任意の要素)は正規表現である。これは ai のみからなる集合 { ai } を表す。
  • XY が正規表現ならば、
    • X|Y も正規表現である。これは X の表す集合と Y の表す集合の和集合を表す。
    • XY も正規表現である。これは X に含まれる記号列に Y に含まれる記号列をつなげてできる記号列の集合 { ab | aX, bY } を表す。
    • X* も正規表現である。これは X に含まれる記号列を 0 個以上つなげて出来る文字列の集合 { an | aX, n ≥ 0 } を表す。
  • 上記の帰納的導出によって構成される記号列のみが正規表現である。

正規表現の定義に、次の項目を含めることもある:

  • ε は正規表現である。これは空記号列 ε のみからなる集合 { ε } を表す。

正規表現 ε の表す集合は正規表現 ∅* の表す集合に等しいので、ε を正規表現の定義に含めなくても ∅* で代用できる。

X|Y の代わりに X+Y と書くことや、XY の代わりに X·Y と書くこともある。また、「|」や「*」の優先順位を明確にするために括弧を使うこともある。


Wikimedia Foundation
・足りないもの
・正規表現チェッカー
・実践で使える検索サンプル
・実践で使える置換サンプル
・正規表現の歴史、うんちく
・リンク
・サイトの紹介
・エディタでの使い方
・プログラミングでの使い方
・問題集
スポンサーサイト
| ホーム |

カレンダー

02 | 2008/03 | 04
- - - - - - 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 - - - - -

最近の記事

月別アーカイブ

タグリスト

ブログ内検索

カテゴリー

RSSフィード

リンク

ブロとも申請フォーム

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。