我很难创建一个正则表达式来查找类似于
F:\work\object\src
的字符串。 我创建了以下我尝试过的演示。 请注意,$match 来自数据库字段,因此将其定义为字符串,然后由 qr 运算符将其设为 RE。
#!/opt/perl/bin/perl
use Try::Tiny;
use Data::Dumper::Concise;
my $str = 'F:\work\object\src';
my @matches = (
"\b F\\:\\work\\object\\src \b",
'\b F\:\work\object\src \b',
q{\b F\\:\\work\\object\\src \b},
q{\b\QF:\work\object\src\E \b},
q{\b F\\:\\work\\\\object\\src \b},
qq{\b F\\:\\work\\\\object\\src \b},
);
my $i = 0;
foreach my $match (@matches) {
print "attempt ".$i++."\n";
try {
my $re = qr{($match)}xims;
print "Built successfully.\n";
if ($str =~ /$re/) {
print "Match\n";
}
else {
print "But did not match!\n";
print Dumper($re);
}
}
catch {
print "$match failed to build re\n";
print "$_\n";
};
}
该测试程序的输出如下:
attempt 0
F\:\work\object\src failed to build re
Missing braces on \o{} in regex; marked by <-- HERE in m/ F\:\work\o <-- HERE bject\sr)/ at ./reparse.pl line 20.
attempt 1
\b F\:\work\object\src \b failed to build re
Missing braces on \o{} in regex; marked by <-- HERE in m/(\b F\:\work\o <-- HERE bject\src \b)/ at ./reparse.pl line 20.
attempt 2
\b F\:\work\object\src \b failed to build re
Missing braces on \o{} in regex; marked by <-- HERE in m/(\b F\:\work\o <-- HERE bject\src \b)/ at ./reparse.pl line 20.
attempt 3
\b\QF:\work\object\src\E \b failed to build re
Missing braces on \o{} in regex; marked by <-- HERE in m/(\b\QF:\work\o <-- HERE bject\src\E \b)/ at ./reparse.pl line 20.
attempt 4
Built successfully.
But did not match!
qr/(\b F\:\work\\object\src \b)/msix
attempt 5
Built successfully.
But did not match!
qr/ F\:\work\\object\src)/msi
尝试 4 和 5 似乎转义了 \o 但无法匹配字符串。 希望能帮助您制作可以使用的绳子。
如果这些匹配的字符串不是一成不变的,我会像这样更改它:
将匹配字符串定义为单引号,并且不带转义符,例如
q(F:\work\object\src)
并构建模式使用
qr{\Q$match\E}
添加单词边界或其他任何需要的内容。
单行示例(Linux 中)
perl -wE'$s=q(F:\o); $m=q(F:\o); $p=qr{\Q$m\E}; say $1 if $s =~ m{($p)}'
打印
F:\o
。
而且,正是如此,我还会使用
/
以外的字符作为分隔符来匹配它们,例如 =~ m{$pattern}
,以便它对于使用 /
的路径是“可移植的”。 对于您的字符串来说,这不是必需的。