1

以下のように定義された変数があります。

my $variable = "This is related to NSQ outage, it is being handled along with all other NSQ alarms. Network team is working on it.";

いくつかのキーワードは次のとおり"is nsq this server"です。

に 2 つ以上のキーワードがある場合、正規表現を$variable使用できますか? true を返す可能性がありますか?

例:

  • キーワードが「is nsq server」の場合: true
  • キーワードが「nsq machine server」の場合: false

ありがとう、上記の質問は解決されたと思います。

そして、私は以下のようにさらに質問があります:

my $var="this is related to NSQ outage, and this is"; 

$var=~/((this|sth).*){2,}/, return true. 

実際には に 'sth' はなく$varthis2 つある。

この状況で正規表現を false に戻すにはどうすればよいですか?

4

5 に答える 5

2

これらのキーワードのうち少なくとも 2 つが文字列に含まれているかどうかだけを確認する必要があり、順序は問題にならない場合は、次のgrepように実行できます。

my $variable = "This is related to NSQ outage, it is being handled along with all other NSQ alarms. Network team is working on it.";
my @keywords = qw(is nsq server);

if ( ( grep { $variable =~ m/\b$_\b/i } @keywords ) >= 2) {
  print $variable;
}

grepで見つかった場合、ブロックはキーワードを返します$variable。返されたフィルター処理されたキーワードのリストに少なくとも 2 つの要素が含まれている場合、一致は true です。

于 2013-08-19T07:14:18.893 に答える
1

|キーワード ペアのすべての可能な組み合わせをキャプチャする多くの文字で正規表現を作成できます。

foreach my $k1 (@keywords) {
foreach my $k2 (@keywords) {
    next if $k1 eq $k2;
    push @expr, "\\b$k1\\b.*\\b$k2\\b";
}
}
$the_regex = join '|', @expr;

...
$variable =~ /$the_regex/i;
于 2013-08-19T06:55:21.477 に答える
1

一致数量詞の数は{}、個々の文字だけでなく、単語全体に対しても機能します。通常行うことの 2 つ以上を一致させたい場合:

/x{2,}/

単語全体(キーワードなど)については、次のことができます。

/((is|nsq|this|server).*){2,}/

例:

# true:
$variable =~ /((is|nsq|server).*){2,}/; 

# false:
$variable =~ /((nsq|machine|server).*){2,}/; 
于 2013-08-19T07:14:52.873 に答える
0

したがって、一意の一致のみが必要です-ハッシュの作業のように見えます。

use strict;
use warnings;

my $right = "This is related to NSQ server outage";
my $wrong = "server is a server server";
my $regex = qr(server|nsq)i;

print "right" if uniq_matches( $right, $regex ) > 1;
print "wrong" if uniq_matches( $wrong, $regex ) > 1; 

sub uniq_matches {
     my ($str, $regex) = @_;
     my %match;
     $match{$1}++ while $str =~ m/($regex)/g;
     return keys %match;
};
于 2013-08-19T14:52:57.027 に答える
0

一致させたいキーワードごとに先読みを追加し、除外するキーワードを除外することができます。

^(?!.*\bDisallowThis\b)(?=.*\bMatchThis\b)(?=.*\bMatchThis\b).*$


例:

「is」、「nsq」、および「server」を含む任意の文字列に一致します。

^(?=.*\bis\b)(?=.*\bnsq\b)(?=.*\bserver\b).*$

同じですが、キーワード "machine" を許可しません:

^(?!.*\bmachine\b)(?=.*\bis\b)(?=.*\bnsq\b)(?=.*\bserver\b).*$

文字列を「nsq」、「machine」、「server」と一致させます。

^(?=.*\bnsq\b)(?=.*\bmachine\b)(?=.*\bserver\b).*$
于 2013-08-19T07:47:12.387 に答える