2013-10-18 107 views
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"; 
     } 

我需要打印測試字符串和測試字符串,你能幫忙嗎?謝謝。在Perl中用空格或無空格匹配字符串

+0

你爲什麼使用['eval'](http://perldoc.perl.org/functions/eval.html)?這個代碼在「eval」之外幾乎以相同的方式工作。主要區別在於'eval'版本較慢,並且有潛在的安全漏洞。 –

回答

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

這將適用於您的具體示例。

test\s?string 

基本上它將空間標記爲可選[\s]?。 我看到這個問題,它需要你知道你正在搜索的字符串內部可能存在空格。

注:您可能還需要使用這將是/Test[\s]?String/i

1

這是一個恐怖的一段代碼在你那裏不區分大小寫的標誌。你爲什麼使用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; 

這兩個編譯指示是至關重要的,以學習如何編寫好的Perl代碼,並且沒有(有效的)理由你應該永遠不要寫代碼他們。