![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?5a7ff87)
単語検索のスクリプトで利用者がミスタイプしたときにもマッチするようにしたいと考えています。
例えば、1文字間違って入力した場合にもマッチするように以下のようなスクリプトを書いたのですが、もっと簡単な記述が(標準以外のモジュールを使わずに)できないでしょうか?ご教示いただけましたら嬉しいです。
以下のスクリプトでしていること・・・
hello を .ello|h.llo|he.lo|hel.o|hell. に変換してマッチ。
use strict;
my $data = "hallo";
my $query = "hello";
my $q_len = length $query;
my $query1 = $query;
my @queries;
for (my $i=0;$i<$q_len;$i++){
substr($query1, $i,1,".");
push @queries, $query1;
$query1=$query;
}
my $regex = join ("|", @queries);
if ($data=~/$regex/){
print "matched\n";
}else{
print "no match\n";
}
No.3ベストアンサー
- 回答日時:
>正規表現で .ello|h.llo|he.lo|hel.o|hell. を簡単に記述する方法はありませんでしょうか
#あんまり変わってないけど
use strict;
my $data = "hallo";
my $query = "hello";
my @queries = ($query) x length($query);
my $i=0;
my $regex = join "|" , map { substr($_, $i++, 1, "."); $_ } @queries;
if ($data=~/$regex/){
print "matched\n";
}else{
print "no match\n";
}
ありがとうございます。BLUEPIXYさんのご回答いつも参考になります。map したのをその行の中で join できるんですね~。($query) x length($query) も今まで見たことがありませんでした。
これ、使わせていただこうと思います。
No.2
- 回答日時:
音が似ている英単語という事なら、モジュールText::Soundexを使うという手も。
use Text::Soundex;
$data = soundex( 'hello' );
print $data eq soundex( 'hallo' ) ? '' : 'no ', 'matched';
参考URL:http://perldoc.perl.org/Text/Soundex.html
No.1
- 回答日時:
#とりあえず、長さが同じということであれば、
#以下のような感じでどうでしょう?
use strict;
my $data = "hallo";
my $query = "hello";
my $i=0;
my $unmatch=0;
foreach (split(//,$query)){
$unmatch++ if substr($data, $i++,1) ne $_;
}
if ($unmatch<=1){
print "matched\n";
}else{
print "no match\n";
}
この回答への補足
ご回答いただき有難うございます!大変勉強になります。foreach (split(//,$query)) とか if substr($data, $i++,1) ne $_; とか自分の発想の中にはありませんでした。
自分の説明がまったく不足していたのですが、実は $data には1万字以上が入る予定で、$query とその前後百字を取り出したいと思っています。
正規表現で .ello|h.llo|he.lo|hel.o|hell. を簡単に記述する方法はありませんでしょうか。←はなからこう聞けばよかったですね。すみません・・・
?=$query(.) みたいな。
↑まったくのでたらめです・・
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- PHP PHP ページング データベース 1 2022/06/16 10:30
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- 英語 「名詞 of 名詞」において、どちらも同一人物が主体となったり所有する名詞の適切な各限定詞について 2 2022/08/18 11:32
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- Perl perl このテキストファイルを簡単に配列に入れるには? 2 2022/04/27 20:24
- PHP ここでの ②if($su_d<>"")の比較演算子 を使う理由は 1 2022/03/26 02:33
- 英語 英語ができる方に質問です。 以下の文がネイティブの方に伝わるかどうかを確認していただけないでしょうか 7 2022/12/16 14:54
- 英語 【 論・表 英訳 】 問題 次の文を英訳せよ。ただし、その文は単独であり、前後に文はないとする。 父 1 2022/07/25 17:03
- 英語 私の車は、購入してから7年目になるが、これまでに車検を3回受けた。の英訳 11 2022/06/13 03:39
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
16進の10進変換について
-
pythonで演算子を変数に代入す...
-
数値かどうかの判定方法
-
Net::FTP使用時の取得値をどう...
-
変数の中は文字列か数値か調べ...
-
【至急!!!】python言語で本を見...
-
<python>数字あてゲーム
-
関数「exists」と「defined」の...
-
Use of uninitialized value ---
-
pythonを使ったプログラミング...
-
PerlCGIでクエリの検索結果が途...
-
コマンド find の「繰り返し」...
-
1_1から1_5へカウントアップ後...
-
python超初心者です(3時間目)。...
-
Pythonでプログラミング プログ...
-
ベーシックをVBに訳してください。
-
特定の文字の個数を取得する簡...
-
Perl でワードファイルのヘッダ...
-
シェルスクリプトで、空白(ス...
-
MAXnum = input('最大数は?') f...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
16進の10進変換について
-
パイソンのクラスについて
-
Pythonでターミナルに文字を出...
-
文字のカラーとフォントの指定...
-
シェルスクリプトで、空白(ス...
-
I2C接続のLCDディスプレイを使う
-
【至急!!!】python言語で本を見...
-
数値かどうかの判定方法
-
awkの正規表現での最左最短マッ...
-
Pythonでコンソールをクリアす...
-
int(input("○○"))の使い方
-
UWSCのSELECT文の記述方法
-
数値英単語変換
-
pythonで演算子を変数に代入す...
-
C言語
-
switch文のエラーについて
-
10進数→2進数の出力について
-
pythonを使ったプログラミング...
-
c言語 16進数の2進数への変換
-
Pythonでプログラミング プログ...
おすすめ情報