我在编写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+)/ );
但似乎这是错误的。
答案 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+)/);