2017-01-16 111 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

相关问题