如何在给定单词后提取字符串中的下一个单词

时间:2017-09-21 08:29:46

标签: regex perl split

我想在ball之后提取下一个单词blue

例如:

I am a blue    #(jjkk, djajd)      ball(apple)

我想在blue之后提取下一个单词。

预期输出为:ball

两个单词之间可能存在无限的空格。

我试过了:

@split_array = split(/\s+/, $');

$next_word = $split_array[1];

3 个答案:

答案 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+|$)/