当前位置:  开发笔记 > 编程语言 > 正文

用于解析目录和文件名的正则表达式

如何解决《用于解析目录和文件名的正则表达式》经验,为你挑选了3个好方法。

我正在尝试编写一个正则表达式,它将使用匹配组解析完全限定路径的目录和文件名.

所以...

/var/log/xyz/10032008.log

将承认group 1 to be "/var/log/xyz"group 2 to be "10032008.log"

看似简单,但我不能让匹配的团队为我的生活工作.

注意:正如一些受访者所指出的,这可能不是正常表达的好用.通常我更喜欢使用我正在使用的语言的文件API.我实际上要做的事情比这复杂得多,但要解释起来要困难得多,所以我选择了一个每个人都熟悉的域名,以便最简洁地描述根本问题.



1> Jeremy Ruten..:

试试这个:

^(.+)/([^/]+)$


这假设有一个路径,而不仅仅是一个文件名.
它还遇到当前目录(.)和根目录(/)的问题.前者不是问题(完全限定的路径名​​不是以点开头); 后者可能是.正则表达式也不处理..反向遍历 - 这可能没问题,因为完全限定可能意味着没有点点位.
`^(.+)\ /([^\/ + +)$`正斜杠必须被转义?

2> Chad Nouis..:

在支持具有非捕获组的正则表达式的语言中:

((?:[^/]*/)*)(.*)

我将通过爆炸来解释这个粗糙的正则表达式......

(
  (?:
    [^/]*
    /
  )
  *
)
(.*)

这些部分意味着什么:

(  -- 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



3> Travis Illig..:

大多数语言都有路径解析功能,可以为您提供此功能.如果你有这种能力,我建议你免费使用免费提供给你的东西.

假设/是路径分隔符...

^(.*/)([^/]*)$

第一组将是目录/路径信息,第二组将是文件名.例如:

/foo/bar/baz.log:"/ foo/bar /"是路径,"baz.log"是文件

foo/bar.log:"foo /"是路径,"bar.log"是文件

/ foo/bar:"/ foo /"是路径,"bar"是文件

/ foo/bar /:"/ foo/bar /"是路径,没有文件.

推荐阅读
TXCWB_523
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有