棘手的正则表达式问题,匹配以关键字开头的行中的值
Tricky regex issue, matching a value in a line beginning with keyword
我正在尝试在文本文件中搜索某个关键字,并在包含该关键字的行以某个值开头时匹配该关键字:例如,我正在尝试匹配 [=22= 的实例] 当这些实例出现在以 "foo" 开头的行中时。例如:
foo dum diddly bar dee
hello world bar hopping
foo how bar you
foo jingle jangle jingle
第一行和第三行应该匹配,但是第二行和第四行应该不匹配。我试过像这样使用 lookbehind 运算符: /(?<=^foo)bar/
,特别是使用 ^
运算符来尝试匹配行的开头,但这不起作用。我还在 foo 和 bar 周围测试了没有 ^
以及有和没有 \b
的情况,试图找出正则表达式出错的地方。作为参考,我使用的是 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 也无济于事。如果有人对如何为此创建成功的正则表达式有任何建议,那将是不可思议的。
您可以使用以下方式进行匹配:
/^(?=foo\b).*?\b(bar)\b.*/gm
并提取与
匹配的值(第1组)
见DEMO
这会给你想要的输出:
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
试试这个:
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
我正在尝试在文本文件中搜索某个关键字,并在包含该关键字的行以某个值开头时匹配该关键字:例如,我正在尝试匹配 [=22= 的实例] 当这些实例出现在以 "foo" 开头的行中时。例如:
foo dum diddly bar dee
hello world bar hopping
foo how bar you
foo jingle jangle jingle
第一行和第三行应该匹配,但是第二行和第四行应该不匹配。我试过像这样使用 lookbehind 运算符: /(?<=^foo)bar/
,特别是使用 ^
运算符来尝试匹配行的开头,但这不起作用。我还在 foo 和 bar 周围测试了没有 ^
以及有和没有 \b
的情况,试图找出正则表达式出错的地方。作为参考,我使用的是 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 也无济于事。如果有人对如何为此创建成功的正则表达式有任何建议,那将是不可思议的。
您可以使用以下方式进行匹配:
/^(?=foo\b).*?\b(bar)\b.*/gm
并提取与匹配的值(第1组)
见DEMO
这会给你想要的输出:
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
试试这个:
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