Perl正则表达式 - 动态正则表达式中的特殊字符

时间:2011-02-28 17:33:53

标签: regex perl

简单的问题(我希望)

我有一个包含符号的动态字符串:?,/等 基本上它是我的apache错误文件

中日志行中的URL字符串

我正在解析我的日志文件,我想查看该行中是否存在某个url实例:

要搜索的网址行:“http://www.foo.com?blah”

问号让我失望,就像正则表达式中的任何特殊字符一样。我正在尝试以下方法:

my $test1 = 'my?test';
my $test2 = 'this is a my?test blah test';

if ($test2 =~ /$test1/)    {    print "YES!!! \n";}
else   {     print "NOOOO!!! \n";  }

这打印NOOOO

my $test1 = 'mytest';
my $test2 = 'this is a mytest blah test';

if ($test2 =~ /$test1/)    {    print "YES!!! \n";}
else   {     print "NOOOO!!! \n";  }

这会打印YES !!!

我需要快速解决这个问题。

非常感谢

4 个答案:

答案 0 :(得分:7)

真的需要正则表达式吗?问题只是一个简单的子字符串搜索...

if (index($test2, $test1) >= 0)    {    print "YES!!! \n";}
else   {     print "NOOOO!!! \n";  }

答案 1 :(得分:4)

也许尝试使用“\ Q”来逃避特殊字符

my $test1 = 'my?test';
my $test2 = 'this is a my?test blah test';

if ($test2 =~ /\Q$test1/)    {    print "YES!!! \n";}
else   {     print "NOOOO!!! \n";  }

输出YES!!!

答案 2 :(得分:3)

quotemeta可以处理特殊的正则表达式字符。

use warnings;
use strict;

my $test1 = quotemeta 'my?test';
my $test2 = 'this is a my?test blah test';

if ($test2 =~ /$test1/)    {    print "YES!!! \n";}
else   {     print "NOOOO!!! \n";  }

{
    my $test1 = quotemeta 'mytest';
    my $test2 = 'this is a mytest blah test';

    if ($test2 =~ /$test1/)    {    print "YES!!! \n";}
    else   {     print "NOOOO!!! \n";  }
}

打印:

YES!!! YES!!!

答案 3 :(得分:1)

您是否在CPAN中查找了可能对您有帮助的现有模块?从PerlMonks开始,我发现了对Apache :: ParseLog和Apache :: LogRegEx

的引用