- PR -

2つの正規表現の組み合わせ

投稿者投稿内容
translator
会議室デビュー日: 2008/01/16
投稿数: 7
投稿日時: 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がマッチされてしまいます。
こんな特殊な例はもしかしたらあまりないのかもしれませんが。
なかなか難しいです。

れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2008-01-16 18:05
引用:

なかなか難しいです。


難しいのも当然です。

2つの正規表現の組み合わせ、と題されてますが、
内容は組み合わせではありません。

引用:

Aにマッチさせて、マッチした後に、そのマッチ全体がBにはマッチしない文字列を検索するにはどうすればよいのでしょうか。



正規表現の動作は基本的に「部分が一致する」です。
「全体が一致する」という機能は正規表現には不向きなのです。
全体を一致させたい場合は区切り文字が前後に挟まっていないとダメです。
行頭や行末は行頭、行末といった仮想文字を仮定することによって、
全体に一致させています。

無理にがんばっても綺麗にはなりませんので、
あきらめたほうがよいと思います。
明智重蔵
大ベテラン
会議室デビュー日: 2005/09/05
投稿数: 127
投稿日時: 2008-01-16 20:42

マッチさせたいパターン
[0-3]{1,3}

マッチ結果に全体マッチしてはいけないパターン
[1-3]{2}

X1Y
X12Y
X128Y

考えてみましたが、
一度の正規表現で、
マッチした結果に、全体マッチするかを試すというのは、無理だと思います。
できるなら知りたいですね。
translator
会議室デビュー日: 2008/01/16
投稿数: 7
投稿日時: 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
がマッチします。
この正規表現でぬけがないでしょうか。
明智重蔵さん、時間をとって考えてくださりありがとうございます。

スキルアップ/キャリアアップ(JOB@IT)