Perl正则表达式实现:提取可选用户字段及指定系统、文件内容
用单个Perl正则实现可选用户字段的提取
当然可以搞定!咱们用一个精准的正则就能同时匹配两种格式,完美提取可选的用户字段、主机名和文件名。
先看核心思路:把用户部分做成可选捕获组,让正则自动判断它是否存在,同时精准分隔主机名和路径里的文件名。
完整代码示例
# 测试两种输入场景 my @test_strings = ( 'test23@testbee:/var/bee/test.html', 'testbee:/var/bee/test.html' ); foreach my $str (@test_strings) { # 核心正则表达式 if ($str =~ /^(?:([^@]+)@)?([^:]+):.*\/([^\/]+)$/) { # 用// ''确保用户字段不存在时为空字符串 my ($user, $sys, $file) = ($1 // '', $2, $3); print "输入: $str\n"; print "User: '$user', Sys: '$sys', File: '$file'\n\n"; } else { print "输入格式不匹配: $str\n"; } }
正则各部分解释
咱们拆解一下这个正则^(?:([^@]+)@)?([^:]+):.*\/([^\/]+)$:
^(?:([^@]+)@)?:开头的可选用户段。(?:...)是个非捕获组,用来把「用户+@」打包成可选单元;([^@]+)捕获所有非@的字符(也就是用户名);末尾的?表示这个单元可以出现0次(无用户)或1次(有用户)。([^:]+):捕获主机名(sys),匹配所有非:的字符,直到遇到冒号为止,完美避开之前把@包含进主机名的问题。:.*\/:匹配冒号后,跳过所有路径字符直到最后一个斜杠,确保我们能定位到最后的文件名。([^\/]+)$:捕获最后一个斜杠后的所有非斜杠字符,也就是目标文件名,直到字符串结尾。
测试结果
运行上面的代码会输出:
输入: test23@testbee:/var/bee/test.html User: 'test23', Sys: 'testbee', File: 'test.html' 输入: testbee:/var/bee/test.html User: '', Sys: 'testbee', File: 'test.html'
完全符合你的需求:有用户字段时提取,没有时留空,同时正确获取主机名和文件名。
内容的提问来源于stack exchange,提问作者new_linux_user
相关产品推荐
相关产品推荐

