我知道这可能是一个常见的问题而且是重复的,但我不知道该怎么做 表达得很好。例如,使用Perl,
@arr = "a bb ccc" =~ /\b(\w+)\b/g;
可以成功获得三个字。
但是如果我添加一个条件,该行必须以特定单词开头,例如 开始(在结果数组中除外)
@arr = "begin:a bb ccc" =~ /begin:.*\b(\w+)\b/g;
这次数组只包含最后一场比赛 ccc
我该如何编写正确的正则表达式?
答案 0 :(得分:1)
似乎您正在寻找contiguous matching。
\ G断言可用于链接全局匹配
@arr = ("begin: a bb ccc" =~ /(?:^begin:|\G)\h*(\w+)\b/g);
(?:^begin:|\G(?!^))
此部分是将匹配项绑定到begin:
^
\G
。(?!^)
匹配结束时上一场比赛。没有\G
\h*(\w+)\b
也会在开始时匹配。
*
匹配\h
任意数量的(\w+)
个水平空格,后跟群组\b
,以便在后面跟$1
后抓取一个或多个单词字符}字边界到\h+
。
而不是[^\w\n]+
使用begin:
来匹配任何不是字符或换行符的字符。要在字符串中的任何位置匹配^
,请移除\G
起始锚点。
另外start
minutes
对于匹配"锚定"特别有用。序列并提取每个后续比赛。
答案 1 :(得分:0)
您不太关注您的数据,特别是如果行开头没有begin
会发生什么。但是你可能想要split
而不是正则表达式
像这样的东西
use strict;
use warnings 'all';
use feature 'say';
my $s = 'begin:a bb ccc';
my @arr;
if ( $s =~ /\Abegin:(.*)/ ) {
@arr = split ' ', $1;
}
else {
say 'No "begin"';
}
say join ',', @arr;
a,bb,ccc