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)
不是以前使用的单词,其中包含非字母数字字符。如果要匹配这些字符,可以