Если класс Вычитание не поддерживается, вы должны быть в состоянии использовать отрицательные классы для достижения вычитаний.
Некоторые примеры [^\D] = \d
, [^[:^alpha:]] = [a-zA-Z]
Ваша проблема может быть решена, как, что, используя негативный класс POSIX символов внутри класса символов, как [^a-z[:^alpha:]CIKMOV]
[^
a-z # not a-z
[:^alpha:] # not not A-Za-z
CIKMOV # not C,I,K,M,O,V
]
Редактировать - Это тоже работает и может быть легче читать: [^[:^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
в основном вычитание.
Вот тест 2 различных отваров класса (в Perl):
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";
Выход показывает прекращение в AZ минус CIKMOV, из протестированных символов ASCII 0-255:
'AB DEFGH J L N PQRSTU WXYZ'
'AB DEFGH J L N PQRSTU WXYZ'
+1 для более чистого подхода. – codaddict
Я действительно не понимаю, как это «чище». Это более холодное решение, не сомневающееся, но более загадочное, чем другие решения. – fresskoma
Это не чистое решение класса символов и его двусмысленность. Измените {2} на {3} год, а затем попробуйте отладить его. – sln