2013-12-09 87 views
0

我试图编写一个接受字符串输入和文件输入的脚本。Perl正则表达式匹配 - 在等式两边使用*

字符串输入会是什么样子:

input_range*_blah 

该文件将包含像这样

*_blah 
input*_*ah 
blah1 
blah2 
blah3 

我希望脚本产生在这个特殊的例子中,第一行和第二行的比赛线路。

我无法弄清楚这个语法,请有人帮我一下吗? 在此先感谢!

+1

你的意思是你想搜索的文字*字符?如果是这样,只是逃避它:\\ * – Donovan

+3

很难理解为什么这种模式应该匹配第一条线或第二条线。文件中的每一行代表一种模式,程序应该打印出与字符串输入相匹配的每种模式? –

回答

1

如果线我正确地理解了这个问题,你的文件包含一系列模式,并且你想打印出与你的输入字符串匹配的每个模式。因此,您将打印*_blahinput*_*ah,因为这两个模式匹配input_range*_blah,但不匹配blah1或以下模式,因为它们与输入字符串不匹配。

在这种情况下,我认为你不需要任何特殊的星号处理。在目标字符串中,星号只是另一个字符 - 它没有任何特殊的解释。此代码应该这样做:

#! /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 
+0

是的,它的工作原理!谢谢@qwrrty –

+0

只是好奇,如果你不这样做而不使用Glob,会有可能吗? –

+0

如果您将文件中的模式写入实际的正则表达式,那么您可以使用'$ input_string =〜/^$ pattern $ /'来代替'match_glob($ pattern,$ input_string)'。您在这里描述的示例模式不是正则表达式,但在Unix中称为“文件名全局模式”是一个正则表达式,您可以在模式中用'。*'替换'*'。 –

0

您需要跳过匹配中的*个字符。尝试使用这个正则表达式:

use warnings; 
use strict; 

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

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

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

这将之前或之后将变量声明为一个匹配任何文字*和逐行读取输入文件行,打印出那些与之匹配

+0

我不认为这真的可以解决问题。什么是OP提到的这个文件的字符串输入?它如何匹配文件输入中的“* _blah”或“input * _ * ah”? –

+0

问题在于,字符串输入(上例中的$ match)也作为脚本的输入输入。你是否建议我在尝试执行正则表达式匹配之前操纵输入? –

+0

@AdityaKV - 我不确定我是否知道你的意思。你想从STDIN读入吗? – fugu