2013-09-26 166 views
2

我目前正在研究一個函數,它將一個關鍵字和一個字符串(一個looong字符串)作爲參數列表,並且我希望它返回每個匹配關鍵字的列表。問題是一個關鍵字可以用2個字。 對於爲例 - keyword1 : foobarkeyword2 : foo barkeyword3 : barfoo將簡單的關鍵字和關鍵字與空格匹配

字符串:

hi this is foobar, have you seen my foo bar, he is very fooBar ? 

我想(foobarfoo bar)的列表;

目前我得到:

@matches = $string =~ m/\b(?:foobar|foo bar)\b/gi ; 

這對於簡單的字詞正常工作,而不是由詞:/

什麼想法?

謝謝你的幫助。

+1

你是什麼意思由詞組成?帶有空格的 – fugu

+0

,比如「foo bar」,我希望它是一個單一的關鍵字。我的意思是我必須儘可能以最快的方式做到這一點,這意味着只能一次滾動字符串。 – user2806258

+0

你能舉一個你不想搭配的東西的例子嗎? – fugu

回答

0

這將返回正確的結果:

sub match { 
    my @[email protected]_; 
    my $s=pop @keywords; 
    return grep {$s=~/\b\Q$_\E\b/i} @keywords; 
} 

my @matches=match('foobar','foo bar','barfoo)','hi this is foobar, have you seen my foo bar, he is very fooBar?'); #this returns (foobar, foo bar) 

BTW代碼@matches = $string =~ m/\b(?:foobar|foo bar)\b/gi;是偉大的工作也一樣,如果你刪除/i修改它返回(foobar的,富吧)

+0

以及我需要/我,因爲我不想區分大小寫 – user2806258

+0

好吧,請檢查我的回覆我已將它更新爲不區分大小寫 – psxls

+0

您可以先傳遞字符串,然後使用'my($ s,@keywords)= @_;' – RobEarl

1
sub myfunc { 
    my ($str, @kw) = @_; 

    my ($re) = map qr/\b ($_) \b/x, join "|", @kw; 

    return $str =~ /$re/gi; 
} 

my @kwords = ("foobar", "foo bar", "barfoo"); 
my @arr = myfunc("hi this is foobar, have you seen my foo bar, he is very fooBar ?", @kwords);