- - PR -
正規表現 代替構成体
1
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 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-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"と表すことが出来ます。) |
|
投稿日時: 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-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)"の後に"?"を入れるのを忘れないよう注意してください。 |
|
投稿日時: 2006-12-24 16:34
よこけんさん、できました!
このケースではまだわからないこともあるのですが、 教えて頂いたことで本のサンプルは理解できたので、 とりあえず学習を進めようと思います。 ありがとうございました! |
1