可选字符匹配正则表达式

问题描述 投票:1回答:2

我有一个条件,我的字符串可能看起来像:

  1. test23 @ testbee:/ var / bee /

要么

  1. testbee:/var/bee/test.html

我需要在这里提取三个字符串:test23(如果可用),testbee和test.html

那么,在Perl,

($user, $sys, $file) = ($source =~ /(\S*?)\@?(\S+?):?[^:]*?([^\/]+)$/);

for 1. give,$ user =,$ sys = test @ testbee,$ file = test.html for 2. this give,$ user =,$ sys = test,$ file = test.html

有没有办法,我可以使用一个表达式来获取用户'test'(如果它存在),如果没有则没有。

regex perl optional-values
2个回答
2
投票

更易维护的解决方案:

use URI qw();
for my $str (qw(
    test23@testbee:/var/bee/
    testbee:/var/bee/test.html
)) {
    my $u = URI->new("ssh://$str");
    printf "user: %s  host: %s  path: %s\n",
        $u->user, $u->host, $u->path;
}

1
投票

这里总是将可选部分与组1匹配,有时$1$3将为空:

(?:(\w+)@)?(\w+):(?:\/\w+){2}\/((?:\w|\.)*)

但是:ぁzxswい

如果您想跳过更多子目录,请用regex101替换{2}

© www.soinside.com 2019 - 2024. All rights reserved.