2013-09-26 3 views
2

В настоящее время я работаю над функцией, которая принимает в качестве аргументов список ключевых слов и строку (строку looong), и я хочу, чтобы она возвращала список каждого сопоставленного ключевого слова. Проблема в том, что ключевое слово может быть в 2 слова. Для Exemple - keyword1 : foobar, keyword2 : foo bar, keyword3 : barfoo)Соответствие простому ключевому слову и ключевому слову с пробелами

строка:

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

я хочу список с (foobar, foo 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, Foo бар)

+0

ну, мне нужно/i, потому что я не хочу быть чувствительным к регистру – 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); 
Смежные вопросы