Regex 基于正斜杠的Perl分割字符串
我是Perl新手,所以这是一个基本问题。我有一个字符串,如下所示。我对从中提取日期感兴趣,所以考虑使用斜杠拆分它Regex 基于正斜杠的Perl分割字符串,regex,perl,Regex,Perl,我是Perl新手,所以这是一个基本问题。我有一个字符串,如下所示。我对从中提取日期感兴趣,所以考虑使用斜杠拆分它 my $path = "/bla/bla/bla/20160306"; my $date = (split(/\//,$path))[3];#ideally 3 is date position in array after split print $date; 但是,我没有看到预期的输出,而是看到5被打印出来。只需将其绑定到末尾: (\d+)$ # look for digits
my $path = "/bla/bla/bla/20160306";
my $date = (split(/\//,$path))[3];#ideally 3 is date position in array after split
print $date;
但是,我没有看到预期的输出,而是看到5被打印出来。只需将其绑定到末尾:
(\d+)$
# look for digits at the end of the string
看。捕获组仅用于澄清,但在本例中并不真正需要
在Perl
中,这将是(我是一个PHP/Python的家伙,所以当它难看时请容忍我)
请参阅。由于路径以分隔符
/
本身开头,split
首先返回一个带有空字符串的列表(在第一个/
的左侧);还有一个因素。因此,发布的代码将错误计数1,并返回路径中最后一个元素(子目录)之前的一个,而不是日期
如果日期始终是字符串中的最后一项,则可以选择最后一项
my $date = (split '/', $path)[-1];
我使用了'
作为分隔符,这样就不必转义/
。(然而,这可能会混淆,因为分隔符模式是正则表达式,/
传达了这一点,而'
可能看起来只是引用了一个字符串。)
这也可以通过正则表达式实现
my @parts = $path =~ m{([^/]+)}g;
这样就不会有初始空字符串。或者,可以使用($path=~m{…}g)[-1]
从上面的完整列表中选择最后一部分,但如果确实只需要最后一位,则直接提取它
my ($last_part) = $path =~ m{.*/(.*)};
在这里,“贪婪的”*
匹配字符串中的所有内容,直到下一个子模式的最后一个实例(/
),从而使我们到达路径的最后一部分,然后捕获该部分。regex match操作符仅在列表上下文中返回其匹配项,因此需要左侧的paren
是什么让我们知道,您正在解析一条路径,并且有专门用于此的库 要将路径拆分为其组件,一个工具是
splitdir
from
如果路径以/
开头,我们将再次获得第一个元素的空字符串(根据设计,请参见文档)。如果有,可以将其移除
shift @parts if $parts[0] eq '';
同样,最后一个元素可以像其他示例中一样单独使用。试试这个
使用“向前看”来完成此操作。它通过拆分捕获/
。然后使用/
替换数据以删除斜杠
my $path = "/a/b/c/20160306";
my $date = (split(/(?=\/)/,$path))[3];
$date=~s/^\///;
print $date;
或者使用模式匹配和分组来完成
my $path = "/a/b/c/20160306";
my @data = $path =~m/\/(\w+)/g;
print $data[3];
@user449355那么还有其他问题。我复制粘贴了你的字符串。如果一切正常,这必须起作用。当对变量包含的内容有疑问时:
使用Data::Dumper;打印转储程序\@拆分代码>
my $path = "/a/b/c/20160306";
my $date = (split(/(?=\/)/,$path))[3];
$date=~s/^\///;
print $date;
my $path = "/a/b/c/20160306";
my @data = $path =~m/\/(\w+)/g;
print $data[3];