- PR -

正規表現 代替構成体

1
投稿者投稿内容
hei
ベテラン
会議室デビュー日: 2006/09/07
投稿数: 78
投稿日時: 2006-12-23 19:26
正規表現の代替構成体
(?( expression )yes|no)
(?( name )yes|no)
はどのように使うのでしょうか?

例えば、「b」にマッチする。
ただし、「b」の一字前が「a」ならば「abc」にマッチする、という場合
次のようにしてみたのですがダメでした。

Dim text As String = "abcdedg"
Dim pattern As String = "(a)b(?(\1)c)"
For Each m As Match In Regex.Matches(text, pattern)
MessageBox.Show(m.Value)
Next
(これでは「ab」にマッチしてしまいます)

サンプルを探しているのですが見つかりません。
宜しくお願いします。
よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2006-12-23 23:13
heiさんの"(a)b(?(\1)c)" というパターンでは、"ab"にしかマッチしません。
このパターンは、「"ab"の後に"a"という文字列が続いていた場合、その"a"が"c"ならマッチしろ」という、ありえない指定をしているわけです。なので単純に"ab"にしかマッチしません。

> 例えば、「b」にマッチする。
> ただし、「b」の一字前が「a」ならば「abc」にマッチする
これを (?( expression )yes|no) の形式を用いて表すならば以下のようになります。
"(?(ab)abc|b)"
このパターンは、「"ab"という文字列が含まれていた場合はその場所を"abc"で検索し、それ以外の場合は"b"で検索する」という意味になります。(これは、単純に"abc|b"と表すことが出来ます。)
hei
ベテラン
会議室デビュー日: 2006/09/07
投稿数: 78
投稿日時: 2006-12-24 14:04
よこけんさん、お世話になっています。

今書籍で学習しているのですが、、
そこにははPerlで書かれた次のサンプルがあります。
(詳細正規表第2版 オライリー p133)

単独の、または<A>・・・</A>で囲まれたHTMLの<IMG>タグをマッチする正規表現
"(<A\s+[^>]+>\s*)?<IMG\s+[^>]+>(?(1)\s*</A>)"

で、これを.NETでやってみようと思い、後方参照の部分を\1にして、
Dim text As String = "<A aaa><IMG bbb></A>"
Dim pattern As String = "(<A\s+[^>]+>\s*)?<IMG\s+[^>]+>(?(\1)\s*</A>)"
For Each m As Match In Regex.Matches(text, pattern)
MessageBox.Show(m.Value)
Next

とすると"<A aaa><IMG bbb>だけがマッチしてしまいます。
これを単純化したものが、始めに上げた例です。

Perlではこのようにできるようですが、
.NETではできず、
.NETでやる場合は、
"<A\s+[^>]+>\s*<IMG\s+[^>]+>\s*</A>|<IMG\s+[^>]+>"
のように|を使わないといけない、ということでしょうか?


よこけん
大ベテラン
会議室デビュー日: 2006/01/31
投稿数: 216
投稿日時: 2006-12-24 15:14
すみません、私も勘違いしていました。

" (?( expression )yes|no) "
ではなく、
" (?( name )yes|no) "
を使うということですね。

"(?( name )yes|no)"にキャプチャ番号を使う場合、"\"は付けません。"\"を付けてしまうと、前方参照構成体として認識されてしまいます。(従って "(?( expression )yes|no)"の形式として処理されてしまいます。)

よって、<IMG>タグの例なら、
"(<A\s+[^>]+>\s*)?<IMG\s+[^>]+>(?(\1)\s*</A>)"
で"\1"と指定せず、書籍と同じように単なる"1"を指定してください。

最初の、
> 例えば、「b」にマッチする。
> ただし、「b」の一字前が「a」ならば「abc」にマッチする
も、"(?( name )yes|no)"の形式で表すと以下のようになりますね。

"(a)?b(?(1)c)"

"(a)"の後に"?"を入れるのを忘れないよう注意してください。
hei
ベテラン
会議室デビュー日: 2006/09/07
投稿数: 78
投稿日時: 2006-12-24 16:34
よこけんさん、できました!

このケースではまだわからないこともあるのですが、
教えて頂いたことで本のサンプルは理解できたので、
とりあえず学習を進めようと思います。

ありがとうございました!
1

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