棘手的正则表达式问题,匹配以关键字

时间:2015-06-01 14:18:49

标签: regex perl file expression

我正在尝试在某个文本文件中搜索某个关键字,并在该关键字所包含的行以某个值开头时匹配该字符串:例如,我正在尝试匹配" bar&#的实例34;当这些实例出现在以" foo"开头的行中。例如:

foo dum diddly bar dee
hello world bar hopping
foo how bar you
foo jingle jangle jingle

第一行和第三行应匹配,但第二行和第四行不匹配。我尝试使用这样的lookbehind运算符:/(?<=^foo)bar/,特别是使用^运算符以尝试匹配行的开头,但是这不起作用。我也在没有^和有和没有\b foo和bar的情况下测试它,试图找出正则表达式出错的地方。作为参考,我使用perl,这是我的整个代码的样子:

use 5.14.2;
use strict;
use warnings;
open(my $fh, "<", "perltest.txt") or die "$!";
while(my $line = <$fh>)
{
    if($line =~ /(?<=^foo)bar/)
    {
        print "succeeded\n";
    }
    else
    {
        print "failed\n"
    }
}
print "finished\n";

我在所有这些线上都无法匹配。它似乎不是我的代码的问题,因为我可以成功地获得更基本的正则表达式评估匹配,所以我相当肯定问题在于后面的问题。我试过regex101也无济于事。如果有人对如何为此创建一个成功的正则表达式有任何建议,那将是不可思议的。

4 个答案:

答案 0 :(得分:1)

试试这个:

while (<DATA>) {
    print if m/^foo.*\bbar\b/
}

__DATA__
foo dum diddly bar dee
hello world bar hopping
foo how bar you
foo jingle jangle jingle

打印:

foo dum diddly bar dee
foo how bar you

答案 1 :(得分:0)

您可以使用以下内容进行匹配:

/^(?=foo\b).*?\b(bar)\b.*/gm

并使用$1(组1)

提取匹配的值

请参阅DEMO

答案 2 :(得分:0)

这将为您提供所需的输出:

use strict;
use warnings;

open(my $fh, "<", "perltest.txt") or die "$!";

while(my $line = <$fh>)
{
    if($line =~ /^foo.*\bbar\b/)
    {
        print "$line";
    }
}

_____DATA_____
foo dum diddly bar dee
hello world bar hopping
foo how bar you
foo jingle jangle jingle

输出:

foo dum diddly bar dee
foo how bar you

答案 3 :(得分:-1)

你不需要外表,只需使用这个正则表达式:

/^foo\b.*?\bbar\b.*$/gm

RegEx Demo

^foo确保该行以foo开头,然后继续匹配bar\b已用于字边界。