我想在ball
之后提取下一个单词blue
。
例如:
I am a blue #(jjkk, djajd) ball(apple)
我想在blue
之后提取下一个单词。
预期输出为:ball
两个单词之间可能存在无限的空格。
我试过了:
@split_array = split(/\s+/, $');
$next_word = $split_array[1];
答案 0 :(得分:2)
这就是诀窍:
(通过Dave Cross更新#1:在\b
前面使用blue
可以在字符串的开头匹配)
use strict;
my $input = 'I am a blue ball(apple)';
if ( $input =~ /\bblue\s+(\w+)/ ) {
my $found = $1;
print "Word found after word 'blue': $found \n";
} else {
print "No word after word 'blue' present\n";
}
输出:
Word after word 'blue' found: ball
更新#2:如何匹配blue
之后的第二个或第三个单词?
将正则表达式从\bblue\s+(\w+)
更改为\bblue\s+\w+\s+(\w+)
以获取第二个单词。
相应地,使用\bblue\s+\w+\s+\w+\s+(\w+)
作为第三个。
这可以写得更短,但我没有,以避免复杂性。
答案 1 :(得分:1)
您有几个基于正则表达式的解决方案,可以向您显示正确的方法。我认为看看我们是否可以建立你的解决方案会很有趣。
所以你在字符串中构建一个单词数组。这很好。
#!/usr/bin/perl
use strict;
use warnings;
use feature 'say';
use Data::Dumper;
$_ = 'I am a blue ball(apple)';
my @split_array = split /\s+/, $_;
say Dumper \@split_array;
这给出了:
$VAR1 = [
'I',
'am',
'a',
'blue',
'ball(apple)'
];
然后使用$split_array[1]
来获取一个字。但当然,这不是正确的词。 $split_array[1]
是数组中的第二个元素 - " am"。
你想要做的是走完阵列,寻找"蓝色"然后获取下一个字符串。像这样:
foreach (0 .. $#split_array - 1) {
if ($split_array[$_] eq 'blue') {
say "The next word is $split_array[$_ + 1]";
}
}
$#split_array
为我们提供@split_array
中最后一个元素的索引(即4)。我们从中减去1,因为我们想要后面的单词" blue"并且在最后一个单词之后不能成为一个单词。
打印:
The next word is ball(apple)
这不是你想要的。出了什么问题?好吧,这是你对split
的原始号召。你在空格上分裂,并且#34; ball"之间没有空格。和" apple"。因此,让我们分开\W+
(非单词字符)。
然后我们在数组中得到一个额外的项目:
$VAR1 = [
'I',
'am',
'a',
'blue',
'ball',
'apple'
];
正确答案。
The next word is ball
答案 2 :(得分:0)
首先,尝试匹配字符串。这是blue
。它可能正处于起步阶段。如果没有,则前面跟着一个空格。
/(^| )blue /
然后,搜索下一个单词。正如一个单词是一组字母后跟空格或行尾:
/([\w]+)( |$)/
将它们连接在一起,只提取搜索到的单词:
/(?:^| )blue ([\w]+)(?: |$)/
您可以替换" blue"通过变量。
正如下面的评论中所建议的那样,可以使用\b
简化开头,并使用"一个或多个空格或标签来优化表达式。 (\s+
):
/\b$searched_word\s+([\w]+)(?:\s+|$)/