正規表現

Posted by muchag | ActionScript,PHP | 2010-07-19 (月) 19:05:29

文字列の検索・置換

正規表現(regular expression) とは、文字列を一般化して表記する手法

素晴らしいのは、ルールが世界共通。(なんだろうな)
よほど古いものでない限り、どの言語でも同じルール を用いる。(んだろうな)
(何々言語では、何々は使えないよ~ という情報があればぜひコメントに。。。)

だからこそ、覚えていて損はない どころか 覚えないといけない。

そういうわけで、やろうやろうと思いつつ放置していた 正規表現 まとめに
重い腰を上げてみる。

特殊文字(メタキャラクタ)

全て半角文字。

特殊文字 意味
^ 行頭
$ 行末
. 任意の一文字
[ ] 括弧内のいずれかの一文字
[^ ] 括弧内のいずれかの一文字以外
| OR
* 直前の一文字の0回以上の繰り返し
+ 直前の一文字の1回以上の繰り返し
? 直前の一文字の0回または1回(2回以上はNG)
( ) グルーピング
選択制御文字 | の適用範囲を限定する場合
繰り返し制御文字の適用範囲を指定する場合
後方参照を使用する場合
\ エスケープキャラクタ

 

メタシーケンス

正規表現パターンの中で特別な意味を持つ一連の文字を メタシーケンス という。
サイトによって載っている情報に過不足がある ので、言語依存のものもありそう。

メタシーケンス 意味
\<oct> を8進数とみなして、それを文字コードに持つ文字
\x<hex> を16進数とみなして、それを文字コードに持つ文字
{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 まで使用可能。

ActionScript 3

  1. var pattern:RegExp = /(\d+)-by-\1/;
  2. // matches the following: 48-by-48

置換のときは $ (ドルマーク)
$1 ~ $99 まで使用可能。

ActionScript 3

  1. var pattern:RegExp = /Hi, (\w+)\./;
  2. var str:String = "Hi, Bob.";
  3. trace(str.replace(pattern, "$1, hello."));
  4. // output: Bob, hello.

 

  1. $x = '0173123456';
  2. $x =~ s/(\d\d\d\d)(\d\d)(\d\d\d\d)/$1-$2-$3/;
  3. print $x;
  4. // 0173-12-3456

 

フラグとプロパティ
フラグ プロパティ 説明
g global 複数箇所に一致
i ignoreCase 一致の判定において大文字と小文字を区別しない
A ~ Z および a ~ z の文字に適用されるが、É や é などの拡張文字には適用されない
m multiline このフラグを設定した場合、$ および ^ はそれぞれ行末と行頭にも一致
s dotall このフラグを設定した場合、.(ドット)は改行文字(¥n)にも一致
x extended 正規表現の拡張機能を有効にする
パターンの一部と見なされない空白を正規表現の中に挿入できるようになる
これにより、正規表現コードの読みやすさが向上

 

ActionScript 3

  1. var re:RegExp = /abc/gimsx;

書式は上記のように / の後ろに付加。
併用可。
 

最長一致のルール

正規表現では、与えられたパターンにマッチする 最も長い文字列 が検索結果になる。

な~にいいいいい! やっちまったなぁ!

という文字列に対して、「な~にい+」という正規表現を用いた場合、検索結果としては
「な~にい」「な~にいい」「な~にいいい」「な~にいいいい」「な~にいいいいい」のうちどれがかかるのか。

最長一致 なので、一番長い「な~にいいいいい」が結果として出てくる。

記述例
  1. $_SESSION['name'] = $row['name'];
  2. \$_SESSION\['(.+)'\] = \$row\[
参考サイト

Flash 用 ActionScript 3.0 のプログラミング:正規表現の使用

第IV部~テキスト編集を極める!!:正規表現について
正規表現
すぐ使える!正規表現サンプル集:文字列を置換しよう

ActionScript,PHP | 2010-07-19 (月) 19:05:29 |

コメントはまだありません »

No comments yet.

RSS feed for comments on this post. TrackBack URI

Leave a comment