正则表达式返回以特定单词开头的行中的所有单词

时间:2015-11-19 00:55:16

标签: regex perl

我知道这可能是一个常见的问题而且是重复的,但我不知道该怎么做 表达得很好。例如,使用Perl,

@arr = "a bb ccc" =~ /\b(\w+)\b/g;

可以成功获得三个字。

但是如果我添加一个条件,该行必须以特定单词开头,例如 开始(在结果数组中除外)

@arr = "begin:a bb ccc" =~ /begin:.*\b(\w+)\b/g;

这次数组只包含最后一场比赛 ccc

我该如何编写正确的正则表达式?

2 个答案:

答案 0 :(得分:1)

似乎您正在寻找contiguous matching

  

\ G断言可用于链接全局匹配

@arr = ("begin: a bb ccc" =~ /(?:^begin:|\G)\h*(\w+)\b/g);

请参阅demo at eval.in

  • (?:^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