$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";
}
我需要打印teststring和Test String,能帮忙吗?感谢。
答案 0 :(得分: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;
答案 1 :(得分: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代码至关重要,并且没有(有效)理由你应该在没有它们的情况下编写代码。
答案 2 :(得分:1)
这适用于您的具体示例。
test\s?string
基本上它将空格标记为可选[\s]?
。
我看到的问题是它需要你知道你正在搜索的字符串中可能有一个空格。
注意:您可能还必须使用不区分大小写的标记/Test[\s]?String/i