
No.1ベストアンサー
- 回答日時:
いまいち自信ないですが…。
まず以下のように考えてみました。
含まれていない文字、たとえばタブ文字は含まれていない前提とします(ヌルなどでも良いかも)。
で、それを区切り文字として2つをつなげてます。
そして最長マッチの法則を利用して、
$match = ("$text1\t$text2" =~ /[^\t]*?([^\t]+)[^\t]*?\t.*?\1.*?/) ? $1 : '';
でやってみると、一見うまくいったように見えましたが、よく考えたら左から探していってマッチしてしまった時点で、それ以上長い文字を探すことをやめてしまう、ということに気付きました。
たとえば「unadon」と「tendon」だと、「don」ではなく「n」でマッチしてしまいます。
で、結局ループを使って文字長から順に最長マッチを探す方法しか思いつきませんでした…。
それを関数として定義すると、以下のような感じです。
$text1 = 'yakiniku';
$text2 = 'ikayakisoba';
$match = &text_match($text1, $text2);
print $match;
# ---------------------------------
sub text_match {
my ($text1, $text2) = @_;
my $len = (length($text1) > length($text2)) ? length($text1) : length($text2);
my $match;
for (1; $len > 0; $len--) {
if ("$text1\t$text2" =~ /[^\t]*?([^\t]{$len})[^\t]*?\t.*?\1.*?/) { $match = $1; last;}
}
return $match;
}
なるほど!がっちり動きますね。
初心者なので一部意味がわかりませんでしたが、使えそうです。しかしやっぱり用意された関数はないのですね?
ありがとうございました。
No.2
- 回答日時:
すでに簡潔な回答が寄せられているのですが、この問題は「最長共通文字列」を探す問題と似ているので、以下のような方法が効率がよいと思いました。
まず問題としては、文字列1の i 番目の文字と文字列2の j 番目の文字からそれぞれ始めて、共通する最長の文字列が何文字になるかを確認して、そのような共通文字列の中で最も長いものを返すような i, j の組み合わせを、すべての可能なi, j の組み合わせの中から探す、ということだと思います。
i, j についていえば、文字列1と2を含む Perl 変数をそれぞれ $s1, $s2 とすると、その範囲はそれぞれ 1<= i <= length($s1)、1<= j <= length($s2) になります。
ところで、ある i, j の組み合わせについては最長文字列の長さが仮に k と分かっているとき、組み合わせi-1, j-1から始まる最長文字列の長さは、文字列1の(i-1)番目と文字列2の(j-1)番目の文字が同じであれば k+1、そうでなければ 0 とすぐにわかるので、実は、このようにすでにわかっている情報を用いることで length($s1) * length($s2) 回の確認でこの作業をすませることができることになります。
ということで、以下のような手続きを書いてみました。
($text1, $text2) = ("oomori-yakiniku","niku-yakisoba");
print &text_match($text1,$text2);
sub text_match {
@s1=split(//,$_[0]);
@s2=split(//,$_[1]);
$match=””;
foreach $i (reverse (0..$#s1)) {
foreach $j (reverse (0..$#s2)) {
if($s1[$i] eq $s2[$j]) {
$c{join(",",($i,$j))}=$c{join(",",($i+1,$j+1))}+1;
$match=join("",@s1[$i..($i+$c{join(",",($i,$j))}-1)])
if($c{join(",",($i,$j))}>length($match));
}
}
}
return $match;
}
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) 2つのテキストファイルを比べて文字列を特定する方法を教えて下さい 5 2022/05/01 15:22
- Visual Basic(VBA) 特定の文字を簡単な操作で半角スペースに変換するか削除したい 2 2022/11/01 10:35
- Visual Basic(VBA) VBAで、特定の文字より後を削除して残った数値を文字列に変換と特定の文字より前も削除したい 3 2022/04/15 19:21
- Excel(エクセル) エクセルで2つの表を比較して、文字列が同じだが、その行のある値が違うものを抽出したい 1 2022/10/06 21:48
- Excel(エクセル) capeofdragonと申します Excel2016を使っておりまして 半角又は全角の任意文字列が 2 2022/10/31 13:51
- Visual Basic(VBA) ファイル名の右側を変更したい ファイル名:「1001日別売上」の左側へ「2022」を追加し、「202 6 2022/10/14 10:03
- Perl perlでリテラル値はメモリにどのように格納されているか? 1 2023/01/15 20:45
- Excel(エクセル) エクセルの日付から年末尾2桁と月を1月をA~Lに変換したい 3 2022/08/08 10:32
- その他(プログラミング・Web制作) awkの文字列比較はPOSIXロケールまたはCロケールにおいてバイナリ値の比較に使えるか gawkな 1 2023/04/22 09:21
- Excel(エクセル) 関数EXACT(文字列,文字列)とexcelVBA 3 2022/04/14 15:07
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
i-phoneホーム画面に関して教え...
-
Perl(Windows)の文法について
-
Windows版のPerlについて
-
どこがおかしいのか教えてくだ...
-
python 3を使えるようになりたい
-
テキストファイルで提出とは?
-
arduino の割り込み処理について
-
メールアドレスの作成について...
-
Perl LINE(チャット) 仕組み
-
Perl SendMail Bcc メルマガ
-
perlでリテラル値はメモリにど...
-
perlの構文でカンマの意味が分...
-
INDIRECT 横に再度抽出したい
-
perl 初等プログラミングについて
-
サクラエディターの設定の仕方...
-
逆スラッシュを使わずにメタ文...
-
Perlで同じフォルダにある任意...
-
phpとperl
-
Perlプログラムについてファイ...
-
Perl 順位の重複
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
テキストファイルで提出とは?
-
openした後、closeしないでプロ...
-
Perlのエラーについてご教授く...
-
INDIRECT 横に再度抽出したい
-
bashスクリプト
-
perlをバージョンアップしたら...
-
perlプログラミング 空白行削除
-
Wallpaper Engineでおすすめの...
-
perlのflock関数でロックをかけ...
-
Strawberry Perl for Windows ...
-
フローチャート 九九
-
perlについての質問
-
ターミナルで特定の文字と文字...
-
LinuxにおいてのPerlのプログラ...
-
P.Cのシングルチューナーとダブ...
-
PerlでUTF-8のファイルの文字列...
-
【超初心者】異なるディレクト...
-
perlで複数のファイルの処理に...
-
Perl 順位の重複
-
Perlで特定文字列から特定文字...
おすすめ情報