我试图编写一个接受字符串输入和文件输入的脚本。Perl正则表达式匹配 - 在等式两边使用*
字符串输入会是什么样子:
input_range*_blah
该文件将包含像这样
*_blah
input*_*ah
blah1
blah2
blah3
我希望脚本产生在这个特殊的例子中,第一行和第二行的比赛线路。
我无法弄清楚这个语法,请有人帮我一下吗? 在此先感谢!
我试图编写一个接受字符串输入和文件输入的脚本。Perl正则表达式匹配 - 在等式两边使用*
字符串输入会是什么样子:
input_range*_blah
该文件将包含像这样
*_blah
input*_*ah
blah1
blah2
blah3
我希望脚本产生在这个特殊的例子中,第一行和第二行的比赛线路。
我无法弄清楚这个语法,请有人帮我一下吗? 在此先感谢!
如果线我正确地理解了这个问题,你的文件包含一系列模式,并且你想打印出与你的输入字符串匹配的每个模式。因此,您将打印*_blah
和input*_*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
是的,它的工作原理!谢谢@qwrrty –
只是好奇,如果你不这样做而不使用Glob,会有可能吗? –
如果您将文件中的模式写入实际的正则表达式,那么您可以使用'$ input_string =〜/^$ pattern $ /'来代替'match_glob($ pattern,$ input_string)'。您在这里描述的示例模式不是正则表达式,但在Unix中称为“文件名全局模式”是一个正则表达式,您可以在模式中用'。*'替换'*'。 –
您需要跳过匹配中的*
个字符。尝试使用这个正则表达式:
use warnings;
use strict;
open my $input, '<', 'in.txt' or die "$!";
my $match = '(.*\*.*)';
while (<$input>){
chomp;
print "$_\n" if /$match/;
}
这将之前或之后将变量声明为一个匹配任何文字*
和逐行读取输入文件行,打印出那些与之匹配
我不认为这真的可以解决问题。什么是OP提到的这个文件的字符串输入?它如何匹配文件输入中的“* _blah”或“input * _ * ah”? –
问题在于,字符串输入(上例中的$ match)也作为脚本的输入输入。你是否建议我在尝试执行正则表达式匹配之前操纵输入? –
@AdityaKV - 我不确定我是否知道你的意思。你想从STDIN读入吗? – fugu
你的意思是你想搜索的文字*字符?如果是这样,只是逃避它:\\ * – Donovan
很难理解为什么这种模式应该匹配第一条线或第二条线。文件中的每一行代表一种模式,程序应该打印出与字符串输入相匹配的每种模式? –