Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 基于正斜杠的Perl分割字符串_Regex_Perl - Fatal编程技术网

Regex 基于正斜杠的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

我是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 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];