使用Perl / regex以这种文件名格式挣扎到模式匹配:word1.word2

时间:2016-09-06 06:45:57

标签: regex perl

我正在解析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+)/

我知道你们中的一些正则表达专家,这不是一个棘手的问题。我很感激一些建议。感谢。

3 个答案:

答案 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参考,以便您可以看到正则表达式的细分。

Regex Example

更新

注意到脚本参数的意图。我很抱歉。正则表达式更新。它会找到参数,但它只会捕获名称值...如果您需要-dbname参数,或者只是名称适合您,请告诉我。此正则表达式设置为“匹配”但不包括它。