【问题标题】:Struggling to pattern match using Perl/regex with this file name format: word1.word2使用 Perl/regex 与此文件名格式进行模式匹配:word1.word2
【发布时间】:2017-06-13 02:02:49
【问题描述】:

我正在解析 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\s+(enroll.\w+)/

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

【问题讨论】:

  • \w 匹配一个字符,所以你最好的是n.name2
  • 只需在第一个 \w 之后添加一个 +

标签: regex perl


【解决方案1】:

您的正则表达式中有错误(缺少+)。您可能会考虑使用Getoptmodules 之一,甚至是内置的-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;

【讨论】:

  • 谢谢。您对我眼前问题的回答非常有效。
  • @BentChainRing 很高兴为您提供帮助!请检查对您最有帮助的答案。 :)
  • 实际上,每个答案都很有帮助,信息丰富,并以自己的方式确认。我可以检查多个吗?
【解决方案2】:

只需将您的正则表达式从 (\w\.\w+) 修改为 (\w+\.\w+)

【讨论】:

    【解决方案3】:

    仅 \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 参数,或者只是名称适合您,请告诉我。此正则表达式设置为“匹配”但不包含它。

    【讨论】:

    • 如果您有不清楚的地方,只需询问 OP,而是根据您的想法修改代码。
    猜你喜欢
    • 1970-01-01
    • 2013-02-27
    • 1970-01-01
    • 1970-01-01
    • 2016-11-02
    • 1970-01-01
    • 2013-01-29
    • 1970-01-01
    • 2013-07-31
    相关资源
    最近更新 更多