正規表現

最終更新: 2012-01-25 (水) 17:12:43 (1890d)

このページの内容はこっちに引越した
正規表現 [俺の基地]

正規表現全般に関して。
かなり正規表現素人なので、しらなくて実装依存なことを書いてしまうかもしれないけど・・・

目次 Edit

正規表現のイメージ Edit

私は正規表現を複雑な表面をもつ立体に巨大なシールを貼り付けていくようなイメージで考えてます

最も単純なルール Edit

左から正規表現がマッチするまで1文字づつ順番に進んでいく、マッチした時点で終わり。あまりにゆるい条件にすると、目的の文字列に到達する前にどこか変なところでマッチして終わってしまうので注意。

特に?によるオプションや*によるゼロ回繰り返し

設計方針 Edit

無理に1個で書かない Edit

なんでも一発で判定できる神業的な正規表現を書くことは難しいので、無理だと思ったら段階的に判断する方法を選んだほうが無難

否定形は処理系と組み合わせて Edit

正規表現の構造上〜にマッチしないというものを書きにくいです。だからそこは処理系と組み合わせて処理したほうが利口

右側から判定は苦手 Edit

正規表現の基本は左側からの判定です。文字列ズバリではなく正規表現で正規表現を挟み撃ちにするような判定は困難です。

Edit

正規表現では1文字を1単位と考えて動作する。
複数文字まとめて動作させたいときは括弧をつける

?は先行する1文字(塊)をオプションにする。 Edit

?は先行する1文字(塊)をオプションにする記号
オプションにするってことはあってもなくてもOKということ

hoge?moge

こうならば、hoge のケツの eがオプションになるので・・・

hogemoge
hogmoge

この両方にマッチする。

「|」は優先順位が低い Edit

hoge|moge

の「|」は e と m の選択になっていそうだけど、実際はhoge と moge の選択として動作する

だから暗黙的に・・・

(hoge)|(moge)

こんな感じ。

たぶんこれは括弧にキャプチャと区切りとの両方の機能をもたせているのでその場合キャプチャ番号が無用に増えてしまわないための対応?

違ってました・・・ or は演算子の結合強度が通常の文字よりもさらに低いため、一番意味的な解釈が最後に行われるからなんですね。

キャプチャ Edit

マッチした文字列を部分的に掴んでおくことができる

キャプチャ番号の採番順序 Edit

  • 外側優先
  • 左側優先

キャプチャしない括弧 Edit

(?:hoge)

このように括弧の頭に「?:」をつけるとキャプチャ対象になりません

場所にマッチさせる Edit

普通は文字にマッチするんですけど、正規表現には場所にマッチさせる記述もできます

先頭にマッチ Edit

ハット記号は先頭にマッチです

^hoge

なのでこれならば先頭のほげにマッチします

hoge
ahoge

上はマッチするけど下はマッチしない
先頭っていう「位置」に続いてhogeが無いとマッチしないから

末尾にマッチ Edit

ドル記号は末尾(行末)にマッチ

hoge$

ある文字列の左側(肯定) Edit

解説だと先読みの肯定とか言われるやつです。
キーワードを?=括弧で括るように記述します

(?=hoge)

これだと

aaaahoge

に対して、hogeの左側・・・つまりaとhの境界の位置にマッチします
これの特徴的なところは位置にマッチなのでhoge自身にはマッチしないということ

何かの文字列のその先にマッチする境界があった場合・・・という意味になる。だから「先読み」と呼ばれる

ある文字列の左側じゃない(否定) Edit

解説だと先読みの否定とか言われるやつです。
キーワードを?!で括るように記述します

(?!hoge)

これは肯定の逆である文字列の左側じゃない部分にマッチします
文字と文字の境界面なんて文字の数だけあるんで、ほとんどどこでもマッチしてしまいます

正規表現で否定という表現を使うのは頭を使いますね。
こいつはホントにこんがらがる。

苦手

部分的なヒットを利用して正規表現を動的に生成する。 Edit

説明はまどろっこしいですけど使い方は簡単

^(...)\1

こう定義しておくと

abcabc

にヒットする

123123

にもヒットする

abc123

にはヒットしない
つまり括弧で括られた部分のヒット内容を\1で利用して全体の正規表現になるような正規表現ってことですハイ

繰り返し Edit

0回以上 Edit

直前の塊のゼロ回以上の繰り返しを表現するのは

a*

アスタリスク「*」を使う
この例の場合だと

aaaa
aa
a

とかにマッチする。

こいつのポイントは「無」にもマッチすること。つまり何かの起点にはこの表現は使えない

1回以上 Edit

a+

指定回数 Edit

指定回数ズバリ Edit

a{4}

この場合は4回繰り返しにマッチ

範囲指定 Edit

4〜10回にマッチさせたかったら

a{4,10}

指定回数以上、以下 Edit

a{4,}
a{,4}

例文 Edit

改行を含むすべてにマッチ Edit

[\s\S]

ドットは改行以外のすべての文字。複数行にわたるものをマッチさせようと思うと改行を含むすべての文字にマッチする正規表現が必要になる。Javascriptのようなオプションが貧弱な処理系では使える技

漢字にマッチ(Unicode処理系) Edit

[一-龠]

このような正規表現でほとんどの漢字にマッチできる。ちょっとはみ出る部分もあるけど実用上問題なし

特定の文字列を含む文字列にヒットしない Edit

否定形の正規表現を作りたい場合に

^(?:(?!hoge).)*$

HTMLのスクリプトタグ部にヒット Edit

元ねたはprototype.jsです。

<script[^>]*>([\S\s]*?)<\/script>

参考サイト Edit

タグ Edit

Tag: 正規表現 文字列操作 移動済み

リロード   new Edit 凍結 差分 Upload 複製 名前変更   Home Page list Word Search Recent Update バックアップ Referer   Help   最終更新のRSS
Last-modified: 2012-01-25 (水) 17:12:43 (1890d)