Регулярное выражение для нескольких согласных - PullRequest
3 голосов
/ 04 февраля 2012

Я ищу шаблон регулярного выражения, который хочу использовать в своем скрипте генератора имен php.

Он должен определить, содержит ли строка три последовательных согласных.Но он не должен обнаруживать строку, если две последовательные согласные трех последовательных согласных совпадают.

Пример:

"hello" -> False, because there aren't 3 consecutive consonants.
"matching" -> True, because there are 3 consecutive consonants.
"apple" -> False, although there are 3 consecutive consonants, because two consecutive of them are the same.

Пожалуйста, помогите мне найти такой шаблон регулярного выражения.

Ответы [ 4 ]

5 голосов
/ 04 февраля 2012

(([b-df-hj-np-tv-z])(?!\2)){3}

http://gskinner.com/RegExr/?2vtnt


Редактировать

Существует крайний случай с этим шаблоном, который завершается неудачей, если он обработанпо той же последней согласной.Например, xyzz должно соответствовать xyz, но не соответствует.

Это будет более точная схема.(([b-df-hj-np-tv-z])(?!\2)){2}[b-df-hj-np-tv-z]

1 голос
/ 04 февраля 2012

Это будет работать.

/([^aeiou]{3})/i

^ в классе означает, что он НЕ должен содержать a, e, i, o, u

1 голос
/ 04 февраля 2012

Это может быть сделано с отрицательным утверждением и обратным просмотром:
1. Используйте обратный просмотр, чтобы построить выражение для соответствия двум одинаковым символам: (.)\1.
2. Добавьте .? перед ним,чтобы поймать пару сразу или после символа: .?(.)\1.
3. 3 последовательных согласных: [b-df-hj-np-tv-z]{3}
4. Добавить № 2 выше в качестве отрицательного утверждения: (?!.?(.)\1)[b-df-hj-np-tv-z]{3}.

Я взял некоторые части из ответа @ zapthedingbat, который более ласковый, но (я думаю) немного ошибается.

0 голосов
/ 04 февраля 2012
/([bcdfghjklmnpqrstvwxyz]{3})/i

Это будет соответствовать 3 согласным подряд.А затем str_split сопоставьте и проверьте, отличаются ли все три элемента.

preg_match_all('/([bcdfghjklmnpqrstvwxyz]{3})/i', $string, $matches);
foreach ($matches[0] as $match) {
    $items = str_split(strtolower($match));
    if ($items[0] != $items[1] && $items[1] != $items[2]) {
        // match
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...