我正在尝试编写一个正则表达式,它将使用匹配组解析完全限定路径的目录和文件名.
所以...
/var/log/xyz/10032008.log
将承认group 1 to be "/var/log/xyz"
和group 2 to be "10032008.log"
看似简单,但我不能让匹配的团队为我的生活工作.
注意:正如一些受访者所指出的,这可能不是正常表达的好用.通常我更喜欢使用我正在使用的语言的文件API.我实际上要做的事情比这复杂得多,但要解释起来要困难得多,所以我选择了一个每个人都熟悉的域名,以便最简洁地描述根本问题.
试试这个:
^(.+)/([^/]+)$
在支持具有非捕获组的正则表达式的语言中:
((?:[^/]*/)*)(.*)
我将通过爆炸来解释这个粗糙的正则表达式......
(
(?:
[^/]*
/
)
*
)
(.*)
这些部分意味着什么:
( -- capture group 1 starts
(?: -- non-capturing group starts
[^/]* -- greedily match as many non-directory separators as possible
/ -- match a single directory-separator character
) -- non-capturing group ends
* -- repeat the non-capturing group zero-or-more times
) -- capture group 1 ends
(.*) -- capture all remaining characters in group 2
为了测试正则表达式,我使用了以下Perl脚本......
#!/usr/bin/perl -w
use strict;
use warnings;
sub test {
my $str = shift;
my $testname = shift;
$str =~ m#((?:[^/]*/)*)(.*)#;
print "$str -- $testname\n";
print " 1: $1\n";
print " 2: $2\n\n";
}
test('/var/log/xyz/10032008.log', 'absolute path');
test('var/log/xyz/10032008.log', 'relative path');
test('10032008.log', 'filename-only');
test('/10032008.log', 'file directly under root');
脚本的输出......
/var/log/xyz/10032008.log -- absolute path
1: /var/log/xyz/
2: 10032008.log
var/log/xyz/10032008.log -- relative path
1: var/log/xyz/
2: 10032008.log
10032008.log -- filename-only
1:
2: 10032008.log
/10032008.log -- file directly under root
1: /
2: 10032008.log
大多数语言都有路径解析功能,可以为您提供此功能.如果你有这种能力,我建议你免费使用免费提供给你的东西.
假设/是路径分隔符...
^(.*/)([^/]*)$
第一组将是目录/路径信息,第二组将是文件名.例如:
/foo/bar/baz.log:"/ foo/bar /"是路径,"baz.log"是文件
foo/bar.log:"foo /"是路径,"bar.log"是文件
/ foo/bar:"/ foo /"是路径,"bar"是文件
/ foo/bar /:"/ foo/bar /"是路径,没有文件.