場合は、減算を達成するために、負のクラスを使用することができるはずです。その代わりに、先読みアサーションを使用することができます。
いくつかの例は、[^\D] = \d
ある[^[:^alpha:]] = [a-zA-Z]
あなたの問題は[^a-z[:^alpha:]CIKMOV]
[^
a-z # not a-z
[:^alpha:] # not not A-Za-z
CIKMOV # not C,I,K,M,O,V
のような文字クラス内負POSIX文字クラスを使用して、そのように解決できます]
編集 - これはあまりにも動作し、読みやすくなるかもしれません:[^[:^alpha:][:lower:]CIKMOV]
[^
[:^alpha:] # A-Za-z
[:lower:] # not a-z
CIKMOV # not C,I,K,M,O,V
]
結果はなしAZある文字クラスでありますC、I、K、M、O、V
は基本的に減算です。ここ
は(Perlで)2つの異なるクラスの調合の試験である:
'AB DEFGH J L N PQRSTU WXYZ'
'AB DEFGH J L N PQRSTU WXYZ'
:
use strict;
use warnings;
my $match = '';
# ANYOF[^\[email protected][-\377!utf8::IsAlpha]
for (0 .. 255) {
if (chr($_) =~ /^[^a-z[:^alpha:]CIKMOV]$/) {
$match .= chr($_); next;
}
$match .= ' ';
}
$match =~ s/^ +//;
$match =~ s/ +$//;
print "'$match'\n";
$match = '';
# ANYOF[^\[email protected][-\377+utf8::IsDigit !utf8::IsWord]
for (0 .. 255) {
if (chr($_) =~ /^[^a-z\d\W_CIKMOV]$/) {
$match .= chr($_); next;
}
$match .= ' ';
}
$match =~ s/^ +//;
$match =~ s/ +$//;
print "'$match'\n";
出力は、試験されたASCII文字0-255から、AZマイナスCIKMOVで中止を示します
出典
2011-01-24 20:03:36
sln
+1クリーンなアプローチです。 – codaddict
私はこれがどのように「クリーナー」なのか本当に分かりません。よりクーラーな解決策ですが、間違いなく、他のソリューションよりも隠された方法です。 – fresskoma
これは純粋な文字クラスの解決策ではなく、あいまいです。今から{2}を{3}年に変更してからデバッグしようとします。 – sln