• 締切済み

正規表現が意図しているより余計にマッチしてしまう

perl の正規表現について質問いたします。 末尾に記載したスクリプトを実行すると、入力中(__DATA__)の --- <subheadword>ccccc</subheadword> <p>ccccc</p> <p type="A">ccccc</p> <p type="B">ccccc</p> <p type="A">ccccc</p> <p type="B">ccccc</p> --- が、正規表現中の --- ( <subheadword>.+?</subheadword>\n <p>.+?</p>\n <p\stype="A">.+?</p>\n <p\stype="B">.+?</p>\n )+ --- の部分にマッチしてしまいます。 なぜマッチするのか、どなたか教えていただけませんでしょうか ---ここから末尾までがソース--- use strict; local $/ = "</dic>\n"; while (my $block = <DATA>) { if ($block =~ m{ <dic>\n <headword>.+?</headword>\n ( <subheadword>.+?</subheadword>\n <p>.+?</p>\n <p\stype="A">.+?</p>\n <p\stype="B">.+?</p>\n )+ </dic>\n }x) { print STDERR "NG\n"; } else { print STDERR "OK\n"; } } __DATA__ <dic> <headword>AAAAAA</headword> <subheadword>aaaaa</subheadword> <p>aaaaa</p> <p type="A">aaaaa</p> <p type="B">aaaaa</p> <subheadword>bbbbb</subheadword> <p>bbbbb</p> <p type="A">bbbbb</p> <p type="B">bbbbb</p> <subheadword>ccccc</subheadword> <p>ccccc</p> <p type="A">ccccc</p> <p type="B">ccccc</p> <p type="A">ccccc</p> <p type="B">ccccc</p> </dic>

みんなの回答

回答No.4

この正規表現が意図するところって、 各<subheadword>の下に<p>タグがABの2つ以外入ってくるような場合はNGにしたいのにOKが出てしまうので困ってる、ということではなかったですか? であれば、単純にNGとOKが逆になってるだけってことはないでしょうか・・? 正規表現的には問題ないようが気がします。 -------------------- print STDERR "NG\n"; } else { print STDERR "OK\n"; } -------------------- ↓ -------------------- print STDERR "OK\n"; } else { print STDERR "NG\n"; } -------------------- 違ってたらスイマセン。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.3

あ、そっか。 通常は . が改行文字にマッチしないのを失念してました。 ということで、その例では、「マッチしません」

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.2

Lazy matchは、「複数候補があった時に、最短のものを選ぶ」ものだから。 <p\stype="B">.+?</p>\n の.+?は、続く「</p>\n」がなるべく近くなるようにマッチしますが、「</p>\n」に「マッチしない」のではありません。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

手元の ActivePerl 5.16.0 ではマッチしない. OK が表示される.

関連するQ&A