我正在解析Perl脚本中的一些参数,并且我很难匹配文件名格式为“name1.name2”的参数。示例名称可能是“enroll.peacecorp”我的代码如下所示:
my $parms = join(' ',@ARGV);
# other params here
$db_name = $1 if ( $parms =~ /-dbname\s+(\w\.\w+)/ );
# more params here
但它似乎没有起作用。我已经尝试将模式设置为/-dbname\s+(\w.\w+)/,但也没有成功。我也尝试了这个,它确实正常工作,但不是那么灵活:/-dbname \ ss+(enroll.\w+)/
我知道你们中的一些正则表达专家,这不是一个棘手的问题。我很感激一些建议。感谢。
答案 0 :(得分:3)
您的正则表达式中存在错误(缺少+
)。您可以考虑使用其中一个Getopt modules,甚至是内置的-s
开关(请参阅perldoc perlrun)来解析您的参数。为了解决您的直接问题,您可以轻松地从正则表达式中获取捕获的表达式,如下所示:
my ($db_name) = $parms =~ /-dbname\s+(\w+\.\w+)/;
或者,不是将@ARGV
加入到字符串中并对其运行正则表达式,而是遍历列表并在-dbname
参数之后获取参数:
my $db_name;
for (my $i = 0; $i < @ARGV; $i++) {
if ($ARGV[$i] eq '-dbname') {
$db_name = $ARGV[++$i];
}
}
die "usage: $0 -dbname foo.bar\n"
unless $db_name;
答案 1 :(得分:2)
只需将您的正则表达式从(\w\.\w+)
修改为(\w+\.\w+)
答案 2 :(得分:0)
只是\ w意味着一个角色。
你必须为那个......添加参数。
? = 0 or 1 of preceeding char.
* = 0 or MORE of preceding char.
+ = 1 or MORE of preceding char.
(?:([-]dbname)\s*)(\w+\.\w+)
对于字符串“-dbname something.cool”,它只返回“something.cool”。
添加Regex101参考,以便您可以看到正则表达式的细分。
更新
注意到脚本参数的意图。我很抱歉。正则表达式更新。它会找到参数,但它只会捕获名称值...如果您需要-dbname参数,或者只是名称适合您,请告诉我。此正则表达式设置为“匹配”但不包括它。