- - PR -
2つの正規表現の組み合わせ
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-01-16 17:00
すみません。今のでうまくいったと思ったのですが、
よく考えてみたらうまくいかない例がありました。 今の例を少し変えて、 A:\d+\.\d+ B:1.*?2 としますと、 (?=(\d+\.\d+))(?((1.*?2))\1(?<!\2)|\1) となりますが、 この正規表現ですと、 21.2 1.23 はマッチしますが、 12.12 にマッチさせようとすると 2.12がマッチされてしまいます。 こんな特殊な例はもしかしたらあまりないのかもしれませんが。 なかなか難しいです。 | ||||||||
|
投稿日時: 2008-01-16 18:05
難しいのも当然です。 2つの正規表現の組み合わせ、と題されてますが、 内容は組み合わせではありません。
正規表現の動作は基本的に「部分が一致する」です。 「全体が一致する」という機能は正規表現には不向きなのです。 全体を一致させたい場合は区切り文字が前後に挟まっていないとダメです。 行頭や行末は行頭、行末といった仮想文字を仮定することによって、 全体に一致させています。 無理にがんばっても綺麗にはなりませんので、 あきらめたほうがよいと思います。 | ||||||||
|
投稿日時: 2008-01-16 20:42
マッチさせたいパターン [0-3]{1,3} マッチ結果に全体マッチしてはいけないパターン [1-3]{2} X1Y X12Y X128Y 考えてみましたが、 一度の正規表現で、 マッチした結果に、全体マッチするかを試すというのは、無理だと思います。 できるなら知りたいですね。 | ||||||||
|
投稿日時: 2008-01-17 10:27
れいさん
返答ありがとうございます。 確かに正規表現に向かないですが、その理由がよくわかりました。ありがとうございます。 昨晩一生懸命考えてみましたが、 (?=(A))(?((?<first>B))\1(?(?<=(?<last-first>B))(?<!\k<last>))|\1) とすればとりあえずうまくいくような気がします。 以前私があげた例では、 (?=(\d+\.\d+))(?((?<first>1.*?2))\1(?(?<=(?<last-first>1.*?2))(?<!\k<last>))|\1) とすれば、 21.2 1.23 12.12 1.2 1.23333 にマッチさせようとすると1.2以外マッチします。 明智重蔵さんがあげてくださった例ですと、 (?=([0-3]{1,3}))(?((?<first>[1-3]{2}))\1(?(?<=(?<last-first>[1-3]{2}))(?<!\k<last>))|\1) となります。 X1Y X12Y X128Y では、 1 2 2 がマッチします。 この正規表現でぬけがないでしょうか。 明智重蔵さん、時間をとって考えてくださりありがとうございます。 |