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

それはあなたが持っている恐ろしいコードです。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;

これらの 2 つのプラグマは、優れた Perl コードの書き方を学ぶ上で不可欠であり、これらを使用せずにコードを記述すべき (正当な) 理由はありません。

于 2013-10-18T16:00:26.973 に答える
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 に答える
1

これは、特定の例で機能します。

test\s?string

基本的に、スペースをオプションとしてマークします[\s]?。これで私が見ている問題は、検索している文字列内のスペースが正確にどこにあるかを知る必要があることです。

注:大文字と小文字を区別しないフラグを使用する必要がある場合もあります。/Test[\s]?String/i

于 2013-10-18T15:51:21.823 に答える