可选字符匹配正则表达式
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