2012-05-07 12 views
0

私はperlで新しく、基本的にキーワードのリストをフィルタリングするための助けを募集しています。要するに、これは単語/フレーズの同じハッシュに対する文字列のハッシュです。これは最小の共通分母を取得し、リストをクリーンアップすることです。例えば単語/フレーズのフィルタ文字列:Perl

リストは以下が含まれて言う:

bat 
bat boy 
bat-boy 
bat&boy 
bat:boy 
bat's 
bat-boy's 
batman & bat boy 

それが唯一の次に一致する必要があります:

bat boy   (because of bat) 
batman & bat boy (because of bat) 

正規表現は明らかに移動するための方法ですが、私は次のように立ち往生していますいくつかの単語に - 、 '、&、:などが含まれているため、/ b(単語境界の一致)は使用できません。

書き込みにはどのような方法が最適でしょうか正規表現?

if $keyx=~m/\Q$keyz\E/ 

すべてのヘルプはあなたが後にしているものは非常にわからない

+1

要件は不明です。あなたは 'バット'と 'バットマン 'をマッチさせたいのですが、'バットボイ'ではなく、キーが文字やスペースに囲まれた言葉にマッチさせたいだけですか? – TLP

+0

申し訳ありませんが、バットマンはバットマンではなく、バットマンが「**バット**ボーイ」の後にあるため、「バットマンとバットボーイ」の2番目の試合は一致しません。 – ssllyy

+0

基本的には、 – TLP

答えて

1

を理解されるだろうが、私はあなたが一致させたい推測しています:私は正規表現であるここで$ keyxに対して$ keyz

をチェックしています単語全体のみ、部分文字なし、および非文字と関連した単語は含まれません。

use strict; 
use warnings; 
use v5.10; 

for (split /, */, <DATA>) { 
    say if /(?<![^ ])bat(?![^ ])/; 
} 

__DATA__ 
bat, bat boy, bat-boy, bat&boy, bat:boy, bat's, bat-boy's, batman & bat boy 

出力:

bat 
bat boy 
batman & bat boy 

だから私たちはキーワードを周囲の文字が空白ではないではないことを主張し、これを達成するための方法は、負のルック周りのアサーションを使用することです。

+0

OPは、リストの先頭にある "バット"は、一致しないだろうと明言していません。理由は...後に空白が必要なのでしょうか? – Barry

+0

@バリー私はそれをミスコミュニケーションにまで下げました。 – TLP

関連する問題