WEB相談室

Webページ作成に関しての何でも掲示板です。

タイトル:シフトJIS検索

0:[投稿] けい [2002/09/22 10:30 ][環境:WIN+OTHER UNIX系+Perl]

ご指南宜しくお願いします。
検索ルーチンに http://www.rescue.ne.jp/cgi/minibbs-kit/ のSearch.1.70.plを利用しています。ですが、これでは正しくマッチさせることができませんので、シフトJISでも可能というPerlメモの「正しくパターンマッチさせる」を参考に試行錯誤しております。

if (index($str, $keyword) > -1) {
 if ($str =~ /^(?:$oneByte_sjis|$twoBytes_sjis)*?\Q$keyword\E/) {
   print "マッチした\n";
 }
}

組替えるのは無理なことなのでしょうか?


1:[回答] JTR [2002/09/24 10:33 ]

>シフトJISでも可能というPerlメモの「正しくパターンマッチさせる」
シフトJISでも可能って本当に書いてありますか?


2:[質問] けい [2002/09/24 18:14 ]

可能でなく、応用でした。
>SJIS の場合にも応用することができます.

応用の仕方がわかりません。


3:[回答] 無印良品 [2002/09/24 19:47 ]

大崎さんのPerlメモはEUCを前提にしているはずです。
その中で使う変数の日本語を事前にEUCに変換し、表示用の
文字コードへ再度変換すれば問題ないと思いますが?


4:[質問] けい [2002/09/24 23:47 ]

Perlメモで「SJISでも応用できる」とあるのは、

>その中で使う変数の日本語を事前にEUCに変換し、表示用の
>文字コードへ再度変換すれば問題ないと思いますが?

ということではないと思うのですが?


5:[回答] B-Cus [2002/09/25 00:45 ]

$ascii = '[\x00-\x7F]';
$sjis_halfkana = '[\xA1-\xDF]';
$sjis_twobytes = '[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]';

if ($str =~ /^(?:$ascii|$sjis_halfkana|$sjis_twobytes)*?\Q$keyword\E/) {

試してませんけど。


6:[回答] けい [2002/09/25 04:00 ]

回答ありがとうございます。
それについては初めに書いています。


7:[回答] B-Cus [2002/09/25 08:49 ]

> それについては初めに書いています。

さっぱり意味がわかりません。何をどういうふうにした結果、
どういう問題が起こっていて、それをどうしたいのかを説明
してください。


8:[回答] JTR [2002/09/25 09:40 ]

あの、横から失礼します。

perlや正規表現が不得意な者ですが、私の認識では、SJISの漢字文字列の正規表現での検索は不可だと思うのですが。

とあるSJISの漢字コード第2バイトは0x40〜0x7Eになり、この中には、正規表現のメタ文字あります。
したがって、正規表現エラーになる可能性があると思うのですが、どうでしょうか?


9:[回答] B-Cus [2002/09/25 10:05 ]

\Q〜\E で囲っているので OK じゃなかったでしたっけ。


10:[回答] JTR [2002/09/25 10:43 ]

>\Q〜\E で囲っているので OK じゃなかったでしたっけ。
今調べたら、OKのようです。

「\Q〜\Eは、非英数文字の前に \ を挿入」
したがって、メタ文字をエスケープするのですね。

>>8
は、無かったことに...。
そして、また一つ、勉強になりました。
ありがとうございました。


11:[回答] けい [2002/09/25 13:34 ]

説明不足でごめんなさい。

            $string = "$name\t$email\t$title\t$value"; # 検索の対象とする文字列

            if ($in{'boolean'} eq 'or') { # 論理和処理(OR)

                $match = 1;
                foreach $term (@keys) { if ($string =~ /$term/i) { $match = 0; }} # 1つでも合っているか?
            }
            else { # 論理積処理(AND)

                $match = 0;
                foreach $term (@keys) {    if (!($string =~ /$term/i)) { $match = 1; }} # 1つでも合わないものがあるか?
            }

            if ($match == 1) { next; }
        }

で、

if (index($str, $keyword) > -1) {
if ($str =~ /^(?:$oneByte_sjis|$twoBytes_sjis)*?\Q$keyword\E/) {
  print "マッチした\n";
}
}

を組替えることが出来ますか? という質問です


12:[回答] B-Cus [2002/09/26 09:38 ]

できます。


13:[質問] けい [2002/09/26 12:55 ]

教えていただけませんか?

自分で変更したところでは、上手く動作しなかったので。


14:[回答] [2002/09/26 22:31 ]

>>7


15:[お知らせ] あまぎ [2002/09/26 23:24 ]

> 何をどういうふうにした結果、
>> 自分で変更したところでは、

> どういう問題が起こっていて、
>> 上手く動作しなかったので。

> それをどうしたいのか
>> 教えていただけませんか?

になっているので、誰もがわけがわからないことに
なっているのでは?

> 何をどういうふうにした結果、
これこれを、このように変えて、

> どういう問題が起こっていて、
こう言う文字列を与えたら、ああなってしまった。

> それをどうしたいのか
こうなって欲しい。

の、これ、こう、この、ああを、具体的に書けば、吉。
分かってくれる人が、今の無限大倍に増えるかも。

どこをどう変えたのか全然説明していないのに、説明
したつもりになっているところが、凶。
できますか、という質問だと、できます・できません
・わかりませんのどれか一言しか求めていないように
取られても仕方ないかも。


16:[質問] けい [2002/09/27 02:12 ]

初めの質問で
if ($str =~ /^(?:$oneByte_sjis|$twoBytes_sjis)*?\Q$keyword\E/) {
↑既にSJISにした状態で尋ねたのですが、>>5の回答が被っていたので、「初めに書いてます」と答えてしまいました。すいません。

------仕切りなおし
foreach $term (@keys) { if ($string =~ /$term/i) { $match = 0; }}
では、バイトズレマッチしてしまいます。そこで、Pearメモの

if (index($str, $keyword) > -1) {
if ($str =~ /^(?:$oneByte_sjis|$twoBytes_sjis)*?\Q$keyword\E/) {
  print "マッチした\n";
}
}
を使って、正しくパターンマッチさせたいのですが、単純に置き換えただけでは、

$string = "$name\t$email\t$title\t$value";

if (index($str, $keyword) > -1) {
if ($str =~ /^(?:$oneByte_sjis|$twoBytes_sjis)*?\Q$keyword\E/) {
 $match = 1; }}

マッチすらしなくなってしまい上手くいきませんでした。
そこで、正しくマッチするようにしたいのですが、伝わったでしょうか?
日本語が出来て無くてスイマセン。


17:[お知らせ] [2002/09/27 08:03 ]

>日本語が出来て無くてスイマセン。
日本語以前に、会話が成立していないと思われ。


18:[質問] けい [2002/09/27 08:43 ]

>>17
は?
またそんなことを言われるのですか


19:[回答] JTR [2002/09/27 08:59 ]

>>18
けいさん、B-Cusさんの
>>5
は、ためされましたか?


20:[回答] けい [2002/09/27 13:02 ]

試す段階で躓いています。
どこに入れたらいいのでしょうか?

$string = "$name\t$email\t$title\t$value";
  if ($in{'boolean'} eq 'or') {
   $match = 1;
               foreach $term (@keys) { if ($string =~ /$term/i) { $match = 0; }}
          }
           else {
               $match = 0;
     foreach $term (@keys) {    if (!($string =~ /$term/i)) { $match = 1; }}
           }
           if ($match == 1) { next; }
       }


21:[回答] BSE [2002/09/27 14:25 ]

>>3
http://www.din.or.jp/~ohzaki/perl.htm#JP_EUC_JP

回答(必須): 状態:

お名前(必須):

e-mail:

URL:




[戻る]

ChaichanPAPA's World