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

Regex 如何提取给定单词后字符串中的下一个单词,regex,perl,split,Regex,Perl,Split,我想在blue之后提取下一个单词ball 例如: I am a blue #(jjkk, djajd) ball(apple) 我想提取blue后面的下一个单词 预期输出为:ball 这两个词之间可能有不确定的空格 我试过: @split_array = split(/\s+/, $'); $next_word = $split_array[1]; 这就是诀窍: (更新#1 via:在蓝色前面使用\b允许在字符串开头进行匹配) 输出: Word after word 'bl

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

例如:

I am a blue    #(jjkk, djajd)      ball(apple)
我想提取
blue
后面的下一个单词

预期输出为:
ball

这两个词之间可能有不确定的空格

我试过:

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

$next_word = $split_array[1];
这就是诀窍:

(更新#1 via:在
蓝色
前面使用
\b
允许在字符串开头进行匹配)

输出:

Word after word 'blue' found: ball
更新#2:如何匹配
blue
之后的第二个或第三个单词

将第二个单词的正则表达式从
\bblue\s+(\w+)
更改为
\bblue\s+\w+\s+(\w+)

相应地,使用
\b蓝色\s+\w+\s+\w+\s+(\w+)
作为第三个字符

这可以写得更短,但我没有,以避免复杂性。

这就做到了:

(更新#1 via:在
蓝色
前面使用
\b
允许在字符串开头进行匹配)

输出:

Word after word 'blue' found: ball
更新#2:如何匹配
blue
之后的第二个或第三个单词

将第二个单词的正则表达式从
\bblue\s+(\w+)
更改为
\bblue\s+\w+\s+(\w+)

相应地,使用
\b蓝色\s+\w+\s+\w+\s+(\w+)
作为第三个字符


这可以写得更短,但我没有,以避免复杂性。

首先,尝试匹配字符串。在这里,它是蓝色的。这可能只是开始。如果不是,则在其前面和后面加一个空格

/(^| )blue /
然后,搜索下一个单词。因为单词是一组字母,后跟空格或行尾:

/([\w]+)( |$)/
将它们连接在一起,只提取搜索到的单词:

/(?:^| )blue ([\w]+)(?: |$)/
您可以用变量替换“blue”

正如下面评论中所建议的,可以使用
\b
简化开头,并使用“一个或多个空格或制表符”(
\s+
)优化表达式:


首先,尝试匹配字符串。在这里,它是蓝色的。这可能只是开始。如果不是,则在其前面和后面加一个空格

/(^| )blue /
然后,搜索下一个单词。因为单词是一组字母,后跟空格或行尾:

/([\w]+)( |$)/
将它们连接在一起,只提取搜索到的单词:

/(?:^| )blue ([\w]+)(?: |$)/
您可以用变量替换“blue”

正如下面评论中所建议的,可以使用
\b
简化开头,并使用“一个或多个空格或制表符”(
\s+
)优化表达式:


您有两个基于regex的解决方案,它们向您展示了正确的方法。我想看看我们是否能在你的解决方案的基础上再接再厉会很有趣

所以,在字符串中构建一个单词数组。那很好

#!/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_数组[1]
是数组中的第二个元素,即“am”

您要做的是遍历数组,查找“blue”,然后获取下一个字符串。大概是这样的:

foreach (0 .. $#split_array - 1) {
  if ($split_array[$_] eq 'blue') {
    say "The next word is $split_array[$_ + 1]";
  }
}
$#split_array
提供了
@split_array
中最后一个元素的索引(即4)。我们从中减去1,因为我们想在“蓝色”之后加上,最后一个单词后面不能有一个单词

上面印着:

The next word is ball(apple)
这不是你想要的。那么出了什么问题?嗯,这是您最初对
split
的调用。你在空格上分裂,“球”和“苹果”之间没有空格。因此,让我们转而使用
\W+
(非单词字符)

然后我们在数组中得到一个额外的项:

$VAR1 = [
          'I',
          'am',
          'a',
          'blue',
          'ball',
          'apple'
        ];
和正确的答案

The next word is ball

您有两个基于regex的解决方案,它们向您展示了正确的方法。我想看看我们是否能在你的解决方案的基础上再接再厉会很有趣

所以,在字符串中构建一个单词数组。那很好

#!/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_数组[1]
是数组中的第二个元素,即“am”

您要做的是遍历数组,查找“blue”,然后获取下一个字符串。大概是这样的:

foreach (0 .. $#split_array - 1) {
  if ($split_array[$_] eq 'blue') {
    say "The next word is $split_array[$_ + 1]";
  }
}
$#split_array
提供了
@split_array
中最后一个元素的索引(即4)。我们从中减去1,因为我们想在“蓝色”之后加上,最后一个单词后面不能有一个单词

上面印着:

The next word is ball(apple)
这不是你想要的。那么出了什么问题?嗯,这是您最初对
split
的调用。你在空格上分裂,“球”和“苹果”之间没有空格。因此,让我们转而使用
\W+
(非单词字符)

然后我们在数组中得到一个额外的项:

$VAR1 = [
          'I',
          'am',
          'a',
          'blue',
          'ball',
          'apple'
        ];
和正确的答案

The next word is ball

使用类似于
my($substring)=$string=~/\bblue\s+(\w+)/使用类似于
my($substring)=$string=~/\bblue\s+(\w+)/
也许可以将开头的
\s+
替换为
\b
(如果单词是字符串中的第一个单词。谢谢,这是一个更一般的解决方案!谢谢…如果想要蓝色后面的第二个或第三个单词,我应该做什么更改?我尝试使用以下示例,但它不起作用:使用strict;my$input=‘我是一个蓝色的(jj)球(苹果)’;if($input=~/\bblue\s+(\w+)/){my$found=$1;print“在单词‘blue’之后找到的单词:$found\n”;}elsif($input=~/\bblue\s+\w+\s+(\w+){my$found=$1;print“在单词‘blue’之后找到的单词:$found\n”;}否则{print“在单词‘blue’之后没有单词出现\n”}@Jayeshranjanmaji:首先,如果第一个条件查找第一个单词,第二个条件查找第二个单词,那么第二个条件将永远不会匹配,因为第一个条件已经匹配。除此之外,
#(jj)
不是以前使用的
单词,其中包含非字母数字字符。如果要匹配这些字符,可以