Perl Regex 无法编译寻找 \object

问题描述 投票:0回答:1

我很难创建一个正则表达式来查找类似于

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 但无法匹配字符串。 希望能帮助您制作可以使用的绳子。

regex perl
1个回答
0
投票

如果这些匹配的字符串不是一成不变的,我会像这样更改它:

将匹配字符串定义为单引号,并且不带转义符,例如

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}
,以便它对于使用
/
的路径是“可移植的”。 对于您的字符串来说,这不是必需的。

© www.soinside.com 2019 - 2024. All rights reserved.