【问题标题】:Quantifier follows nothing in regex量词在正则表达式中不遵循任何内容
【发布时间】:2013-07-22 21:15:20
【问题描述】:

我的要求是使用 perl 打印文件名中包含 'xyz' 文本的文件。 我在下面尝试并得到以下错误

量词在正则表达式中没有任何内容,由

use strict;
use warnings;

my @files = qw(file_xyz.xlsx,file.xlsx);
my @my_files = grep { /*xyz.xlsx$/ } @files;
for my $file (@my_files) {
    print "The output $file \n";
}

当我在 grep 正则表达式中添加 * 时,问题来了。 我怎么可能做到这一点?

【问题讨论】:

    标签: perl grep


    【解决方案1】:

    * 是一个元字符,称为量词。它的意思是“重复前一个字符或字符类零次或多次”。在您的情况下,它什么都不遵循,因此是语法错误。您可能正在尝试匹配任何内容,即.*: 通配符,后跟一个量词。但是,这已经是正则表达式匹配的默认行为,除非它被锚定。所以你只需要:

    my @my_files = grep { /xyz/ } @files;
    

    您可以保留字符串锚xlsx$ 的结尾,但由于文件名列表有限,这似乎没有必要。虽然你用错了qw(),但不是逗号分隔,是空格分隔:

    my @files = qw(file_xyz.xlsx file.xlsx);
    

    但是,如果您应该有一组更大的文件名,例如从目录中读取的文件名,则可以在中间放置一个通配符字符串:

    my @my_files = grep { /xyz.*\.xlsx$/i } @files;
    

    注意使用/i 修饰符不区分大小写。另请注意,您必须转义 .,因为它是另一个元字符。

    【讨论】:

    • 是的。我添加了 '*' 来匹配任何字符,它应该有 'xyz' 并以 '.xlsx' 结尾.. 那我怎样才能达到我的要求
    • 是的,明白了。我在 qw() 中添加逗号犯了一个错误。谢谢你的回答..
    • @Mari 不客气。通常,当你误用 qw() 时,Perl 会给你一个警告。
    • 谢谢兄弟 :) 您添加了许多可能的方法来不丢失我们的搜索文本...很好..
    • @Mari 嗯,你知道,在 Perl 中有不止一种方法可以做到这一点。 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-01
    相关资源
    最近更新 更多