単語検索のスクリプトで利用者がミスタイプしたときにもマッチするようにしたいと考えています。
例えば、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ランキング
-
Pythonでターミナルに文字を出...
-
パイソンのクラスについて
-
16進の10進変換について
-
UWSCのSELECT文の記述方法
-
【至急!!!】python言語で本を見...
-
シェルスクリプトで、空白(ス...
-
Tiny Basicのプログラムでもう...
-
チェックボックスのCGIへの値の...
-
m//gとm//gcの違い
-
javaのパッケージ構成で各パッ...
-
perl言語について
-
数値英単語変換
-
Perlの例文でif($a==1&&$b==5&&...
-
I2C接続のLCDディスプレイを使う
-
PythonでUTF8の文字列をリスト...
-
CLispのloop内の挙動について
-
Application.ScreenUpdating = ...
-
JSONで文字列が長い時
-
どちのほうがすきですか?
-
パイソンのクラスのブログラム
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
16進の10進変換について
-
Pythonでターミナルに文字を出...
-
シェルスクリプトで、空白(ス...
-
【至急!!!】python言語で本を見...
-
pythonで演算子を変数に代入す...
-
c言語 16進数の2進数への変換
-
パイソンのクラスについて
-
I2C接続のLCDディスプレイを使う
-
関数「exists」と「defined」の...
-
pythonの*
-
変数の中は文字列か数値か調べ...
-
数値かどうかの判定方法
-
python print文のエラー
-
int(input("○○"))の使い方
-
Perlの例文でif($a==1&&$b==5&&...
-
awkの正規表現での最左最短マッ...
-
Use of uninitialized value ---
-
CGIでimgタグでalignを使うとエ...
-
swift 文字コードから文字に変...
-
javaのパッケージ構成で各パッ...
おすすめ情報