регулярное выражение фильтр только в верхнем регистре согласных - PullRequest
0 голосов
/ 21 февраля 2019

Я прохожу онлайн-курс по регулярным выражениям.Вопрос:

С помощью регулярного выражения вы можете посчитать количество совпадений.Можете ли вы заставить его возвращать количество прописных согласных (B, C, D, F, .., X, Y, Z) в данной строке?Например: он должен возвращать 3 с текстом ABcDeFO !.Примечание: только ASCII.Мы считаем Y согласной!Пример: регулярное выражение / ./g вернет 3 при запуске со строкой abc.`

И мое решение имеет длину /[BCDFGHJKLMNPQRSTVWXYZ]/g ( 26 символов)

другое мое решение - /(?![AEIOU])[A-Z]/g длиной 19 символов.но согласно онлайн статистике самое короткое решение - 16 символов.Есть идеи, как это сделать?


снимок экрана

Ответы [ 2 ]

0 голосов
/ 21 февраля 2019

Это соответствует всему, что не является AEIOUa-z, а затем добавление \W\d означает, что оно исключит также все специальные символы и цифры.Это 17 символов, и, насколько я вижу, он работает на всех строках.

preg_match_all("/[^AEIOUa-z\W\d]/", $str, $m);
var_dump($m);

Возвращает

array(1) {
  [0]=>
  array(3) {
    [0]=>
    string(1) "B"
    [1]=>
    string(1) "D"
    [2]=>
    string(1) "F"
  }
}

https://3v4l.org/a0ETV

0 голосов
/ 21 февраля 2019

Я думаю, что мне удалось сократить длину регулярного выражения до 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...