シンプルで簡単な正規表現の解決策を得ることはできません。
#!/usr/bin/env perl
use strict;
use warnings;
my %whitelist = map { $_ => 1 } qw(dvi-d dvi-i);
my $string = 'use-either-dvi-d-or-dvi-i';
while ($string =~ m{ ([^-]+) (-) ([^-]+) }gx) {
my $segment = substr($string, $-[0], $+[0] - $-[0]);
unless ($whitelist{ $segment }) {
substr($string, $-[2], 1, ' ');
}
pos($string) = $-[ 3 ];
}
print $string, "\n";
@-
配列が一致したグループの開始オフセットを含み、@+
配列は終了オフセットが含まれています。ただし、次のことを試みることができます。どちらの場合も、要素0
は完全一致を指します。
私はこのbecause of how \G
worksような何かに頼らなければならなかった:s///
がすでに交換されている置換の一部を上書きすることを拒否することを
も注意してください。したがって、たとえば、これはむしろ、文字列を逆方向にその方法を反復するよりも、最初の反復の後に停止します。
$_ = "123456789";
pos = 6;
s/.(?=.\G)/X/g;
print; # prints 1234X6789, not XXXXX6789
たぶん@tchristが彼の意志に様々なアサーションを曲げる方法を見つけ出すことができます。
何を試しましたか? 'dvi-i'と' dvi-d'はあなたが除外したい唯一のフレーズですか?または、それらの「ホワイトリスト」がありますか? –
実際には白いリストが良いかもしれません。残っているかもしれない言葉が残っているかもしれません。 –