正規表現 勉強メモ
まずはこちらのページをもっかい読み直した。一応人間なのでここに書いてある事は理解できました。ていうか、初めて正規表現に触る人間にはめっちゃ分かりやすいと思います。
メタ文字
メタ文字 | 意味 |
---|---|
\ | 多目的に使う一般的なエスケープ文字 |
^ | 検索対象の文字列の始まり |
$ | 検索対象の文字列の終わり |
. | 任意の1文字(改行を除く) |
[ | 文字クラスの始まり |
] | 文字クラスの終わり |
| | 選択 いずれかの文字列 |
( | サブパターン(グループ化)の開始 |
) | サブパターン(グループ化)の終了 |
? | 0または1 回マッチ(直前の文字がまったくないか、1つだけある) |
* | 0回以上の繰り返し(直前の文字がないか、1個以上連続する) |
+ | 1回以上の繰り返し(最低でも1個は + の直前の文字が必要) |
{ | 最小/最大を指定する量指定子の開始(繰り返しの数) |
} | 量指定子の終了 |
文字クラスので使えるメタ文字
メタ文字 | 意味 |
---|---|
\ | 一般的なエスケープ文字 |
^ | クラスの否定 ただし、文字クラスの最初の文字に用いた場合のみ |
- | 文字の範囲の指定 |
] | 文字クラスの終了 |
いざ、解読してみる
正規表現でURLが正しい形かどうかを調べるパターンを知りたかったので「PHP 正規表現 url」でググったらこちらのページが出てきたので、これを頑張って解読する。
/^(https?|ftp)(:\/\/[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]+)$/
- 最初と最後の「/」
- デリミタ。
- 「^」
- 文字列の先頭
- 「(https?|ftp)」
- 最初と最後の( )はサブパターン(グループ)
- 「?」は直前の要素が0個(空)か1個、「|」はどちらかにマッチ。
- つまり「httpかhttpsかftpのいずれかから始まる文字列にマッチ」
- 「:\/\/」
- http://の「://」の部分。\はエスケープ。(デリミタとかぶってるからかな)
- 「[-_.!~*\'()a-zA-Z0-9;\/?:\@&=+\$,%#]」
- [ ]は文字クラス。この[ ]の中のいずれかにマッチする。
- 文字クラスの中の「-」は範囲。但し、「-」が先頭や末尾で使われた場合は文字として扱う。
- 「a-z」「A-Z」「0-9」は小文字のaからz、大文字のAからZ、数字の0から9のどれか。
- 「-」「_」「.」「!」「~」「*」「\」「'」「(」「)」「a-z」「A-Z」「0-9」「;」「\」「/」「?」「:」「@」「&」「=」「+」「$」「,」「%」「#」のいずれかを含む文字。
- 「+」
- 1以上繰り返し
- 「$」
- 文字列の最後
ということで、この意味は『「http」か「https」か「ftp」のいずれかから始まって、「://」が続いてその後「-」「_」「.」「!」「~」「*」「\」「'」「(」「)」「a-z」「A-Z」「0-9」「;」「\」「/」「?」「:」「@」「&」「=」「+」「$」「,」「%」「#」のいずれかの文字が1回以上続く』パターンにマッチするもの、という意味になる。
文字クラスの中の記号については多分これ。RFC 3986で決まってるやつ。
>>Uniform Resource Identifier (URI): Generic Syntax
>>Uniform Resource Identifier (URI): 一般的構文
これ、解読した後、こんなページも見つけてだな・・・。
ほんとだ。確かにhttp://wwwでも通ってるし。まぁいいや。
PHPの正規表現関連の関数
PHPの正規表現の関数にはereg系の関数と、Perl互換のpreg系の関数がある。マニュアルによると、Perl互換の正規表現構文を使用するpreg_match()の方が、多くの場合ereg()よりも速く動作するとのこと。
ereg系(POSIX正規表現関数)
ereg | 正規表現によるマッチングを行う |
---|---|
eregi | 大文字小文字を区別せずに正規表現によるマッチングを行う |
ereg_replace | 正規表現による置換を行う |
eregi_replace | 大文字小文字を区別せずに正規表現による置換を行う |
split | 正規表現により文字列を分割し、配列に格納する |
spliti | 大文字小文字を区別しない正規表現により文字列を分割し、配列に格納する |
sql_regcase | 大文字小文字を区別しないマッチングのための正規表現を作成する |
- バイナリセーフではない。
- ・・・その他の事マニュアル読んでもよくわかんない。あんまり使わない方がいいみたいな雰囲気を感じた。
preg系(Perl互換の正規表現関数)
preg_match | 正規表現によるマッチングを行う |
---|---|
preg_match_all | 繰り返し正規表現検索を行う |
preg_replace | 正規表現検索および置換を行う |
preg_split | 正規表現で文字列を分割する |
preg_grep | パターンにマッチする配列の要素を返す |
preg_last_error | 直近の PCRE 正規表現処理のエラーコードを返す |
preg_quote | 正規表現文字をクオートする |
preg_replace_callback | 正規表現検索を行い、コールバック関数を使用して置換を行う |
- PCREっていうのは汎用の正規表現ライブラリのこと。
- バイナリセーフ
- スラッシュ (/) などのデリミタで囲う必要がある。
- デリミタとしては、英数字およびバックスラッシュ(\) 以外のすべての文字を使用可能。
- デリミタ文字を正規表現本体において使用する必要がある場合は、 バックスラッシュでエスケープする。
- PHP 4.0.4 以降、 Perl形式の (), {}, [], <> も使用可能。
- パターン修飾子が使える。
参考サイト
- PHP: 正規表現の詳細 - Manual
- サルにもわかる正規表現入門
- 正規表現 - Wikipedia
- 23. 関数とバイナリセーフ:ITpro
- 正規表現の問題集1(基本編):CodeZine
↑これは途中で挫折した。また今度頑張る。
真面目に勉強し始めて思ったけど、正規表現ってパズルみたい。レイトン教授もこういう問題出せばいいのに。なんだか正規表現ってすごく面白いものだったんだなぁ、と思いました。ネットの情報で済まそうと思ってたけど、本買ってくる。
<< PHP ユーザー定義関数 | PHP ヒアドキュメント >>
トラックバック
このエントリーのトラックバックURL:
http://redline.hippy.jp/cgi/mt/mt-tb.cgi/219