Я думаю, что мне удалось сократить длину регулярного выражения до 16, который, как вы говорите, является минимальной требуемой длиной.
Использование факта, когда в вопросе говорится:
Примечание:Только ASCII
Регулярное выражение с положительным или отрицательным прогнозом в будущее превышало длину независимо от того, как сильно вы пытаетесь уменьшить длину регулярного выражения.Включение всех допустимых согласных в верхнем регистре приводит к длине в 26, что слишком много.
Следовательно, похоже, единственный способ - использовать класс отрицанных символов, где некоторые, как мы хитро, исключаем все ненужные символы.Вот регулярное выражение, которое отклоняет все символы ASCII, кроме согласных в верхнем регистре.
[^ -AEIOU[-ÿ]
^
помечает его как отрицательный символьный класс, а пробел в A " -A"
исключает все ненужные символы, как видно в ASCIIстол как они не нужны.Затем мы убираем E
I
O
U
специально, а затем, исключая оставшиеся ненужные символы ASCII, можно сделать, используя диапазон [-ÿ
, так как символ [
присутствует сразу после Z
и ÿ
будучи последним символом в расширенных символах ASCII.И, таким образом, создано выше регулярное выражение, которое соответствует только согласным символам в верхнем регистре, исключая остальные все символы ASCII.
Общая длина этого регулярного выражения /[^ -AEIOU[-ÿ]/g
равна 16, как и ожидалось.Дайте мне знать, если это работает нормально для вас.
Демо
PHP-код,
$s = 'GAsSDITR';
preg_match_all(@'/[^ -AEIOU[-ÿ]/', $s, $matches);
echo count($matches[0]);
Печать,
5
Онлайн-демонстрация PHP