Perl の正規表現で()を付ける場合と付けない場合

[戻る]
ちゃり [E-Mail] 2005/07/26(火) 09:55:02
こんにちわ。

Perl の正規表現についてご教示ください。

例えば、'<hogehoge>7月25日 午前 更新しました</hogehoge>' というような文字列から、'7
月25日 午前'だけを抜きだそうと、
if ($html =~ /^(.*?)>([^>]+?月.+?日\s+\S+)\s+(.*)$/si) {
と書いて $2 の値を取得しようとしたのですがマッチングしませんでした。
そこで、何となく直感で
if ($html =~ /^(.*?)>(([^>]+?)月(.+?)日 \S+)\s+(.*)$/si) {
という具合に、'[^>]+?' と '.+?' を()で囲ってやると正しく取得出来ました。

そこで質問なのですが何故この場合、()で囲ってやらないと正しくマッチングしないのでしょ
うか?
'[^>]+?月'の、[^>]+? を()で囲む/囲まないでマッチングの条件にどういった変化が発生す
るのでしょう?

識者の方にご教示いただければ幸いです。

dairygoods 2005/07/28(木) 13:26:10
正確なところは分からないですが、
漢字の文字コードが悪さをしているような気がします。

[^>]+?(月).+?(日)
とかでも、マッチしますね。

ちゃり [E-Mail] 2005/07/28(木) 21:28:02
[[解決]]
dairygoodsさん、ありがとうございました。

? が「月」とか「日」と並ぶとよくないんですかねえ・・・
() が単なる区切り文字代わりになってマッチング出来るということですね。

日本語混じりのマッチングをして、「これであってるはずなのになあ」という状況になったら、
とりあえず () で囲んでみることにします。:-)

古いスレッドには追加発言できません。