正则表达式标识完整路径名称

时间:2016-12-05 20:48:13

标签: regex perl pathname

我有数据,其中某些行可能在第二个字段中包含完整路径名。我需要确定这样一条线。

我找到了“How can I extract a file path from a Perl string?”,但我只是放弃了尝试。

我坚持使用包含字母数字,下划线,短划线和点的路径名称,其中的组件用斜杠/分隔。

我想将这些示例视为路径名称:

  • /abc/qwert_yu.1234/now_at_file.name4
  • /_.123/zaqe/0987_123.666/how_deep/can-I-go

每个组件应该与qr(^[\w\.\-]+$)之类的模式相匹配,并且我有这个工作。

我的问题是匹配包含任意数量段的路径,每个段前面都有正斜杠。

我尝试了很多这样的排列:

$dir_pat = qr(/($fpat))

当我测试时

p "/qwe.123_545-FFF" =~ $dir_pat

它只是不匹配。

2 个答案:

答案 0 :(得分:4)

看起来你在问以下为什么不匹配。

my $fpat = qr(^[\w\.\-]+$);
my $dir_pat = qr(/($fpat));
"/qwe.123_545-FFF" =~ $dir_pat

禁用,您的模式如下:

/^[\w\.\-]+$

因此,您尝试匹配/后跟字符串的开头。那永远不会匹配。你想要

^/[\w\.\-]+$

答案 1 :(得分:0)

您需要围绕整个模式的锚点,而不是每个路径段周围的锚点

use strict;
use warnings 'all';
use feature 'say';

for my $path (
    '/abc/qwert_yu.1234/now_at_file.name4',
    '/_.123/zaqe/0987_123.666/how_deep/can-I-go' ) {

    say "ok" if $path =~ m|^(?:/[\w.-]+)+$|;
}

输出

ok
ok