在特定单词后提取第一个单词

时间:2017-01-16 06:00:47

标签: regex perl

我在编写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+)/ );

但似乎这是错误的。

5 个答案:

答案 0 :(得分:3)

非常接近:

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

注1:=~会返回已捕获项目的列表,因此分配目标必须是列表。

注意2:在anywhere

之后允许一个或多个空格

答案 1 :(得分:1)

在Perl v5.22及更高版本中,您可以使用\b{wb}来获得更好的自然语言结果。模式可能是

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

“wb”代表单词分词,它会解释其中包含撇号的单词,如“我会”,而\b则不会。

.+?\b{wb} 

匹配其中没有分词符号的最短非空字符序列。第一个匹配句子中的空格范围;第二个匹配“除”。它括在括号中,因此在完成后$1包含“except”。

\b{wb}perlrebackslash

中得到最充分的记录

答案 2 :(得分:0)

首先,您必须围绕=运算符的左侧表达式编写括号,以强制执行regexp评估的数组上下文。请参阅m// and //文档中的perlop。[1]你可以写 括号也围绕=~绑定运算符以提高可读性,但没有必要,因为=~具有相当高的priority

使用POSIX Character Classes word

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

注意我正在使用x,因此会忽略regexp中的空格。还可以使用\b字边界正确锚定正则表达式。

[1]:我写my ($w_after)只是为了方便,因为您可以将my ($a, $b, $c, @rest)写为等同于(my $a, my $b, my $c, my @rest),但您也可以控制变量的范围,例如(my $a, our $UGLY_GLOBAL, local $_, @_)

答案 3 :(得分:-1)

匹配此正则表达式:

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

^\s+两个空格之间的单词

感谢。

答案 4 :(得分:-1)

如果您还想考虑标点符号,例如:

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

然后试试这个:

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