【问题标题】:Perl trim path regexPerl 修剪路径正则表达式
【发布时间】:2011-12-21 16:37:21
【问题描述】:

所以我正在修剪一条看起来像这样的路径:

E:\folder\00000000\file.txt

我想替换这个:

E:\folder\

我无法想出这样做的正则表达式。

我之前确实问过这个问题,但顺序混乱。

【问题讨论】:

  • 您能提供更多信息吗?您的所有路径都具有相同的格式吗?您真正想使用正则表达式捕获路径的哪一部分?
  • Regex trim path to last folder and file 的可能重复项用相关信息更新原始问题。

标签: regex perl path


【解决方案1】:

用正则表达式操作路径很糟糕。

use Path::Class::File qw();
my $path = Path::Class::File->new_foreign('Win32', 'E:\\folder\\00000000\\file.txt');
# E:\folder\00000000\file.txt
my $base = $path->parent->parent;
# E:\folder

【讨论】:

  • 是什么让你觉得这里需要外国的?但更重要的是,问题不在于如何提取 E:\folder,而在于替换它。
  • 使用普通导出的 file 构造函数并在其上调用 parent 让我想到,它返回 .,但明确告诉这是一个 DOS-ish 路径总是有效的。 - 我责怪问题中的表述不明确。如果可以的话,我会把赞成票转给你的答案。
  • 不,say Path::Class::File->new_foreign('Win32', 'file.txt')->parent 也返回 .
  • 使用整个路径。 $ perl -mPath::Class::File -E'say Path::Class::File->new_foreign(q(Win32), q(E:\\folder\\00000000\\file.txt))->parent'␊E:\folder\00000000␊$ perl -MPath::Class=file -E'say file(q(E:\\folder\\00000000\\file.txt))->parent'␊.␊
  • 但是如果你使用整个路径,file 也不会返回.。所以 Foreign 并不“总是有效”,file 总是和 Foreign 一样有效(除非你实际上是在一个外国系统上)。
【解决方案2】:

假设变量驱动器名称和文件夹仅包含下划线/连字符:

/^[A-Z]:\\(\w|_|-)+\\/

将匹配E:\folder\

【讨论】:

  • 这成功了!只要它允许我,我会标记它是正确的!非常感谢!
【解决方案3】:

使用这个正则表达式 ^(.*[\\/])([^\\/]+[\\/][^\\/]+)$

$1 将等于 E:\folder\$2 将等于 00000000\file.txt

【讨论】:

  • 请注意,Windows 路径名也可以包含/ 字符,因此使用[\\\/] 是一种更偏执的方式来处理分隔符。
【解决方案4】:
use Path::Class qw( file dir );

my $file      = file('E:\\folder\\00000000\\file.txt');
my $orig_base = dir('E:\\folder');
my $new_base  = dir('F:\\directory');

# F:\directory\00000000\file.txt
say $file->relative($orig_base)->absolute($new_base);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-12-22
    • 2021-09-20
    • 2015-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-13
    • 2017-01-18
    相关资源
    最近更新 更多