新しく質問する

utf-8での日本語正規表現の書き方

役に立った:2件
  • 質問者:nonolamy
  • 投稿日時:2007/09/21 22:13
  • 困り度:困ってます

WindowsXPでPerlの正規表現の勉強をしています。
下記のスクリプトを作りテストしているのですが例1はマッチするのに例2はマッチしません($countが0のままです)。どうしてなのでしょうか?なおスクリプトファイルも、hoge.txtも共にUTF-8です。どなたかお教えいただけますでしょうか。どうぞよろしくお願いします。

use utf8;
use encoding ("utf-8");

# 例1##################################
$str1 = "そろそろ夏も終わりですね。";
$str2 = "夏";
if ($str1 =~ /夏/)
{
print "例1の答え: 含まれています \n";
}
else
{
print "例1の答え: 含まれていません \n"
}

# 例2 ###################################
$count = 0;
open(FH, "C:\\temp\\hoge.txt");
while(<FH>)
{
if (/夏/)
{
$count++;
}
}

print "$count \n";

この質問への回答は締め切られました。
このQ&Aは役に立ちましたか?(役に立った:2件)
  • 参考になった:0件

No.2ベストアンサー20pt

  • 回答者:sakusaker7
  • 回答日時:2007/09/21 23:48

実はPerlのUTF8文字列には二種類あります。
とか断言しちゃうといいすぎなんですが、例1でのUTF8文字列には
「UTF8フラグ」というものがついています。その一方で例2の
ファイルから読み込んできたものにはこの「UTF8フラグ」はついていません。
このため、スクリプト中の'夏'と外部ファイルにあった'夏'とが
同じものとはみなされなかったために質問にあるような結果になります。

#1の回答でhimajin10000さんがやっているようにファイルのオープンを
すると、こんどはUTF8フラグがついた状態でファイルからの読み込みが
行われます。そうすることで二つの'夏'が同じであると認識されるように
なったわけです。

use utf8や use encoding 'utf8' というのはただ単にスクリプトが
utf8で書かれていることを明示するプラグマではありませんので
注意が必要です。

Perl 5.8.x Unicode関連
http://www.rwds.net/kuroita/program/Perl_unicode …

通報する

この回答へのお礼

早速のご教示ありがとうございました。
問題が解決しました。
"utf8フラグ"とは重要なものだったのですね。
(以前何かで読んだような記憶がありますが
素通りしていました。)
参考URL早速見せて頂きました。
知りたかったことが盛り沢山で感謝です。
ありがとうございました。

  • 参考になった:0件

No.1ベストアンサー10pt

use utf8;
use encoding ("utf-8");

# 例1##################################
$str1 = "そろそろ夏も終わりですね。";
$str2 = "夏";
if ($str1 =~m/夏/)
{
print "yes\n";
}
else
{
print "no\n";
}

# 例2 ###################################

#よくわからんが読むときにutf-8を指定してみた。
#http://osksn2.hep.sci.osaka-u.ac.jp/~taku/osx/pe …


$count = 0;
open(FH, "<:utf8", "C:\\Data\\Administrator\\Others\\Oshiete_Goo\\Quarter3\\Q3365289\\Q3365289-1\.txt");
while($fuga = <FH>)
{
if ($fuga =~m/夏/g)
{
$count = $count + 1; #行数
}
}
print "$count \n";

$count = 0;

open(FH, "<:utf8", "C:\\Data\\Administrator\\Others\\Oshiete_Goo\\Quarter3\\Q3365289\\Q3365289-2\.txt");
while($fuga = <FH>)
{
while ($fuga =~m/夏/g)
{
$count = $count + 1; #個数(一行に複数含まれる)
}
}
print "$count \n";

$count = 0;

open(FH, "<:utf8", "C:\\Data\\Administrator\\Others\\Oshiete_Goo\\Quarter3\\Q3365289\\Q3365289-3\.txt");
while($fuga = <FH>)
{
while ($fuga =~m/aaa/g)
{
$count = $count + 1; #aaaaaの時には最初の1回しか検出されない。(3個ではない!)aaaaaaなら2個
}
}
print "$count \n";

#========================Q3365289-1.txtおよびQ3365289-2.txt===========
#そろそろ夏も終わりですね。夏
#夏
#========================Q3365289-3.txt=========
#aaaaa


#出力結果
#yes
#2
#3
#1

通報する

この回答へのお礼

詳細な例を使ってのご教示ありがとうございました。
お教えの通りやりますとマッチするようになりました。
どうもありがとうございました。

  
このQ&Aは役に立ちましたか?(役に立った:2件)

このページのトップへ