![]() |
* U K I Y A H O N P O * Nel mezzo del cammin di nostra vita mi ritrovai per una selva oscura, che la diritta via era smarrita. |
正規表現講座/11 のバックアップ(No.3)
再開さて、一旦クローズしたこの講座ですが、正規表現には他にも色々な記号があります。 ただし、これ以降で紹介する正規表現は、今までよりさらに「処理系に依存」する、 原則としてこれ以降の講座では Microsoft .NET の正規表現ライブラリをベースに、 先読み、前読み今回は、「先読み」「前読み(戻り読み)」について記載します。 これ、第10回までに書こうかどうか悩んだのですが・・・ でも最近、やっと日本語で一言で説明する方法を思いつきました。 数値を抜きたいけど・・・文章の中から、数値を抜き出したいとします。 \d+ これで数値にマッチします。 ですが、「100円」というように、後に「円」が来る数値は抜き出したくないとします。 \d+[^円] 思いつくのはこうではないでしょうか。 つまり、「ゆねねは100けのっぴ」というような文章があった場合、先の例では、 100け がマッチしてしまうのですね。欲しいのは「100」の部分だけだというのに。 ただし!こんなときに登場するのが、「先読み」です。 \d+(?!円) これで この「ただし」のバリエーションとしては以下のものがあります。 (?=) (?!) (?<=) (?<!)
なお、これらの正規表現に使うカッコ「()」は、グループ化やキャプチャのためのカッコとはみなされません。 グループ化でいいんじゃないの?さて、さっきの「円が続かない数値」を抜き出したいのであれば、何もそんなことをしなくても、 (\d+)[^円] のようにグループ化しておいて、「$1」で取り出せばいいんじゃないの、と思われた方、するどい。 困る場合1前後に文字が続かないケースがある場合。 困る場合2余分なものをマッチすると他のマッチが殺される場合。 「100けののけ」という文章から、「後に円が来ない数値」と「けののけ」を抜き出したい場合・・・ (\d+)[^円]|けののけ のように書いても、最初に「100け」をマッチさせてしまうと、残るのは「ののけ」。「けののけ」はマッチできません。 注意点さっきのバリエーションの表では「任意の正規表現」と書きましたが、これらの「先読み」「前読み」の中では、 ちょっと脱線今回、日本語で「ただし!」と書きましたが、正確にはこれらの「先読み」「前読み」は、ゼロ幅アサーション、 「^\d+」と書けば、「行の先頭位置」「数字の1文字以上の繰り返し」という意味になりますが、同じように、 「位置を表す正規表現」であるがゆえに、文字にはマッチせず、余分な文字を食べてしまうことがないわけですね。 ご意見などはこちらへ |