2017-01-16 109 views
2

我很難編寫Perl程序來提取某個單詞之後的單詞。提取特定單詞後的第一個單詞

例如:

Today i'm not going anywhere except to office. 

我想anywhere後的話,那麼輸出應該是except

我已經試過這

my $words = "Today i'm not going anywhere except to office."; 
my $w_after = ($words =~ /anywhere (\S+)/); 

但似乎這是錯誤的。

+1

最充分的可以接受來自以下更新的答案記錄。 – ssr1012

+1

@ ssr1012:人們也可能會等待一兩天,看看是否有更好的答案出現 – Borodin

+0

@Borodin:OP說'/確認'它有助於'Jim Garrison'的答案。因此我在這裏要求。 – ssr1012

回答

3

非常接近:

my ($w_after) = ($words =~ /anywhere\s+(\S+)/); 
^ ^      ^^^ 
    +--------+      | 
    Note 1      Note 2 

注1:=~返回捕獲項目的列表,所以分配對象必須是一個列表。

注2:允許一個或多個空格後anywhere

+0

感謝Jim..it幫助!!! – MrAZ

+0

@JimGarrison你能解釋一下'()'的用法嗎? 'my($ w_after)= $ words =〜/ anywhere \ s +(\ S +)/;'這也給出了相同的結果,那麼爲什麼。 – mkHun

+2

@mkHun用於運算符優先級。在這種情況下'=〜'比'='更具優勢,這就是爲什麼給出相同的結果。 –

-1

這正則表達式匹配:感謝

my ($expect) = ($words=~m/anywhere\s+([^\s]+)\s+/); 

^\s+字兩個空間

之間

+0

謝謝@ ssr1012..it幫助!!! – MrAZ

-1

如果你也想考慮到標點​​符號,像:

my $words = "Today i'm not going anywhere; except to office."; 

那就試試這個:

my ($w_after) = ($words =~ /anywhere[[:punct:]|\s]+(\S+)/); 
0

首先,你必須寫身邊的=左側表達括號運算符強制數組上下文進行正則表達式評估。請參閱m// and //中的perlop文檔。[1]你可以在=~附近編寫 括號來提高可讀性,但它不是必須的,因爲=~具有相當高的priority

使用POSIX Character Classesword

my ($w_after) = ($words =~/\b anywhere \W+ (\w+) \b /x); 

注意我使用x所以在正則表達式空格被忽略。還可以使用\b字邊界正確地錨定正則表達式。

[1]:我寫my ($w_after)只是爲了方便,因爲你可以寫my ($a, $b, $c, @rest)作爲(my $a, my $b, my $c, my @rest)等價的,但你也可以控制你的變量範圍像(my $a, our $UGLY_GLOBAL, local $_, @_)

+1

雖然你的回答是正確的,但OP需要的是'my($ w_after)',所以它在列表上下文中進行賦值。我認爲說出來會很有用。 – Sobrique

1

在Perl v5.22及更高版本中,您可以使用\b{wb}獲得更好的自然語言結果。該模式可

/anywhere\b{wb}.+?\b{wb}(.+?\b{wb})/ 

「WB」代表字符,它會考慮出現在他們撇號的話,如「我要」,即純\b沒有。

.+?\b{wb} 

匹配在其中沒有分詞符的最短的非空字符序列。第一個匹配句子中空格的跨度;第二個匹配「except」。它用括號括起來,所以完成後$1包含「except」。

\b{wb}perlrebackslash

相關問題