1
$search_buffer="this text has teststring in it, it has a Test String too";
@waitfor=('Test string','some other string');

foreach my $test (@waitfor)
        {
            eval ('if (lc $search_buffer =~ lc ' . $test . ') ' .
                  '{' .
                  '    $prematch = $`;' .
                  '    $match = $&; ' .
                  '    $postmatch = ' . "\$';" .
                  '}');

            print "prematch=$prematch\n";
            print "match=$match\n"; #I want to match both "teststring" and "Test String"
            print "postmatch=$postmatch\n";
        }

我需要打印测试字符串和测试字符串,你能帮忙吗?谢谢。

4

3 回答 3

2
my $search_buffer="this text has teststring in it, it has a Test String too";

my $pattern = qr/test ?string/i;

say "Match found: $1" while $search_buffer =~ /($pattern)/g;
于 2013-10-18T15:47:59.680 回答
2

那是您那里的一段可怕的代码。你为什么要使用eval并尝试将字符串连接成代码,记住插入一些变量而忘记了一些?根本没有理由eval在这种情况下使用。

我假设您lc正在尝试使匹配不区分大小写。这最好通过/i在您的正则表达式上使用修饰符来完成:

$search_buffer =~ /$test/i;   # case insensitive match

在您的情况下,您正在尝试将一些字符串与另一个字符串进行匹配,并且您想要补偿大小写和内部可能的空白。我假设您的字符串是以某种方式生成的,而不是硬编码的。

您可以做的只是使用/x修饰符,这将使您的正则表达式中的文字空白被忽略。

您应该考虑的是字符串中的元字符。例如,如果您有一个字符串,例如foo?,元字符?将改变您的正则表达式的含义。\Q ... \E您可以使用转义序列禁用正则表达式中的元字符。

所以解决方案是

use strict;
use warnings;
use feature 'say';

my $s = "this text has teststring in it, it has a Test String too";
my @waitfor= ('Test string','some other string', '#test string');

for my $str (@waitfor) {
    if ($s =~ /\Q$str/xi) {
        say "prematch  = $`";
        say "match     = $&";
        say "postmatch = $'";
    }
}

输出:

prematch  = this text has teststring in it, it has a
match     = Test String
postmatch =  too

请注意,我使用

use strict;
use warnings;

这两个 pragma 对于学习如何编写好的 Perl 代码至关重要,没有(有效的)理由你应该在没有它们的情况下编写代码。

于 2013-10-18T16:00:26.973 回答
1

这适用于您的具体示例。

test\s?string

基本上它将空间标记为 optional [\s]?。我看到的问题是,它要求您知道您正在搜索的字符串中可能存在空格的确切位置。

注意:您可能还必须使用不区分大小写的标志,这将是/Test[\s]?String/i

于 2013-10-18T15:51:21.823 回答