Повторяющиеся символы и регулярные выражения

Fedor_A_Nohrin

Новичок
Повторяющиеся символы и регулярные выражения

Имеем: массив $a

Необходимо обрабатывать лишь те строки в которых содержатся символы a-zA-Z, при это длина не менее 5 символов (это просто)
При этом ни один символ не может повторяться подряд более одного раза
Написал вот такую регулярку:

foreach($a as $line) {
if(preg_match("/^[a-z]{5,}$/i",$line) {
...
}
}

как модифицировать ее(если такое вообще возможно) чтобы хорошими записями были:
abcde
abced
abcba
и т.д.

а плохими:
aaaaa
abbcd
abccd
и т.д.
 

crocodile2u

http://vbolshov.org.ru
Это какая-то шарада? Или это задача по работе? Если второе, изложи, пожалуйста ее полнее, не вырывая из контекста. Часто, когда возникают такие вот условия (постороннему человеку они кажутся надуманными) - можно просто подойти к проблеме с другого края и надобность в реализации таких вот требований просто отпадает.
 

Fedor_A_Nohrin

Новичок
Задача по работе. Ничего надуманного не вижу, скорее тонкости в использовании регулярных выражений.
 

crocodile2u

http://vbolshov.org.ru
гемоглобин
неправильно. Цитирую: "ни один символ не может повторяться подряд более одного раза"

Fedor_A_Nohrin. Не хочешь рассказать подробнее - не надо.
 

crocodile2u

http://vbolshov.org.ru
функция проверки строки на то, что в ней есть последовательности одинаковых символов, навскидку, должна занять строк 5. Пройтись посимвольно по строке и, если текущий символ такой же, как следующий - вернуть TRUE, иначе вернуть в конце FALSE.

Мне кажется, регулярками задачу не решить. К тому же, как говорится, "если ты решаешь свою проблему с помощью регулярок, считай, что у тебя уже две проблемы".

-~{}~ 25.03.10 18:11:

А если бы мы знали подоплеку задачи, ее, возможно, и не пришлось бы решать.
 

Gas

может по одной?
if (strlen($str) < 5 || preg_match('~([a-z])\1~i', $str)) continue;

как-то так?
 

Fedor_A_Nohrin

Новичок
В итоге пришлость отказаться от регулярок и решить задачу так:
PHP:
function checkLine($text,$len) {
	$a = '';
	$slen = strlen($text);
 	if($slen<$len) return(false);
 	for($i=0;$i<$slen;$i++) {
		if($text[$i]!=$a) {
			$a = $text[$i];
		} else {
			return(false);
		} 
	}
	return(true);
}
 

Gas

может по одной?
В итоге пришлость отказаться от регулярок
почему? c учётом того, что у тебя нет проверки на допустимые символы, то функцию можно переписать так:

PHP:
function checkLine($text,$len) {
  return !(strlen($text) < $len || preg_match('~(.)\1~', $text));
}
 
Сверху