可选字符匹配正则表达式

Posted

技术标签:

【中文标题】可选字符匹配正则表达式【英文标题】:Optional character match regex 【发布时间】:2018-03-01 23:25:55 【问题描述】:

我的字符串可能看起来像这样:

    test23@testbee:/var/bee/

    testbee:/var/bee/test.html

这里需要提取三个字符串:test23(如果有的话)、testbee和test.html

所以,在 Perl 中,

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

对于 1. 这给出了 $user = , $sys = test@testbee, $file = test.html 对于 2. 这给出了 $user = , $sys = test, $file = test.html

有没有办法,如果它存在,我可以只使用一个表达式来让用户“测试”,如果不存在则什么都没有。

【问题讨论】:

你要这样做/(?:([^@\s]+)@)?([^\s:]*):.*\/(.*)/吗? @revo 实际上我没有看到你的评论,然后我的答案最终都是一样的:) 【参考方案1】:

更可维护的解决方案:

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;

【讨论】:

【参考方案2】:

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

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

演示:regex101

如果您想跳过更多子目录,请将2 替换为*

【讨论】:

有趣..会调查这个!

以上是关于可选字符匹配正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

可选字符匹配正则表达式

正则表达式模块re:正则表达式常用字符常用可选标志位group与groupsmatchsearchsubfindallcompile

匹配带有可选前瞻的正则表达式

匹配正则表达式中的可选斜杠

正则表达式修饰符 - 可选标志

带有可选匹配组的正则表达式