3

文字列一覧はこちら

  1. abc-1234 こんにちはこんにちは~abc-3456 わかりました~abc-4456
  2. abc-1234
  3. abc-2356 こんにちは~abc-1234 わかりました
  4. abc-1234 OK~abc-1234 こんにちは
  5. abc-1234 わかりました~abc-1234 こんにちは~abc-1456 わかりました わかりました

abc-1234 が存在する唯一の「abc-」パターンであるかどうかを検出し、それに一致する正規表現パターンを作成する必要があります。abc-1234 が別の abc-xxxx パターンとともに存在する場合、一致するはずがありません。つまり、abc-1234 が存在する唯一の abc-1234 の出現に一致する正規表現パターンを記述する必要があります。abc パターンの前には常に「~」が付くことに注意してください。

したがって、上記の場合、正規表現パターンと文字列を一致させようとすると、次の結果が得られます: 1. 一致しない 2. 一致する 3. 一致しない 4. 一致する 5. 一致しない

ここで正規表現の専門家が私を助けてくれますか?

ありがとう!

4

3 に答える 3

3

正負の先読みを使用する:

use strict; use warnings;
my @s = ('abc-1234 hi hello~abc-3456 ok~abc-4456',
    'abc-1234', 'abc-2356 hi~abc-1234 ok', 'abc-1234 ok~abc-1234 hello',
    'abc-1234 ok~abc-1234 hello~abc-1456 ok ok');

for my $s (@s) {
    if ($s !~ /^abc-(\d+)(?=.*~abc-(?!\1))/) {
        print "$s\n";
    }
}

出力

abc-1234
abc-1234 ok~abc-1234 hello
于 2013-07-16T23:52:48.723 に答える
0

2 つの正規表現を使用した Perl のソリューション。すべての一致 abc-\d\d\d\d の数を取得し、その数を abc-1234 一致の数と比較します。

print if  ( () = /abc-\d\d\d\d/g) ==  ( () = /abc-1234/g);
于 2013-07-17T02:29:47.927 に答える