Perl正则表达式匹配 - 在等式的两边使用*

时间:2013-12-09 22:25:30

标签: regex perl

我正在尝试编写一个接受字符串输入和文件输入的脚本。

字符串输入如下:

input_range*_blah

该文件将包含类似

的行
*_blah
input*_*ah
blah1
blah2
blah3 

我希望脚本在此特定示例中为第一行和第二行生成匹配。

我无法弄清楚这个的语法,请有人帮帮我吗? 提前谢谢!

2 个答案:

答案 0 :(得分:1)

如果我正确理解了问题,那么您的文件包含一个模式列表,并且您希望打印出与输入字符串匹配的每个模式。因此,您可以打印*_blahinput*_*ah,因为这两种模式都匹配input_range*_blah,但不匹配blah1或以下模式,因为它们与输入字符串不匹配。< / p>

在这种情况下,我认为您不需要对星号进行任何特殊处理。在目标字符串中,星号只是另一个字符 - 它不会被解释为任何特殊方式。这段代码应该这样做:

#! /usr/bin/perl

use warnings;
use strict;

use Text::Glob qw/match_glob/;

my $input_string = $ARGV[0];
shift;

while (defined (my $pattern = <>)) {
    chomp $pattern;
    print $pattern, "\n" if (match_glob($pattern, $input_string));
}

演示:使用包含示例字符串的文件glob.dat

$ perl glob.pl 'input_range*_blah' glob.dat
*_blah
input*_*ah

答案 1 :(得分:0)

您需要在匹配中转义*个字符。尝试使用此正则表达式:

use warnings;
use strict; 

open my $input, '<', 'in.txt' or die "$!";

my $match = '(.*\*.*)'; 

while (<$input>){
    chomp;
    print "$_\n" if /$match/;
}

这将声明一个变量作为文字*之前或之后的任何内容的匹配项,并逐行读取输入文件,打印出与其匹配的行