Модераторы: Aliance, skyboy, MoLeX, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> шаблон для полиндрома 
:(
    Опции темы
sugee
Дата 11.3.2006, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



В одном учебнике встретил задачу по регулярным выражениям.
Нужно написать шаблон для полиндрома из шести букв.
Я ее вроде решил, но по условию нужно было уже в самой регулярке
проверить что строка является полиндромом.
Вот как бы это сделать?
Код

$str="арозаазора"; 
//у меня полиндром из 10 букв но дело не в этом

$re='/^(\w{5})(\w{5})$/';

preg_match($re, $str, $matches);

if($matches[1]==strrev($matches[2]))
echo "полиндром";
   else  echo "не полиндром";

PM MAIL   Вверх
ZlojEzh
Дата 12.3.2006, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.10.2005
Где: Киев, Украина

Репутация: 2
Всего: 15



Код

  $str = "abcdedcba";
  $re = "#(\w)((\w?)|(?R))\\1#";
  if (preg_match($re,$str,$match)) {
    print_r($match);
  } else {
    print "no match\n";
  }


Код

  Array
  (
      [0] => abcdedcba
      [1] => a
      [2] => bcdedcb
      [3] =>
  )

попробую объяснить, как этот рег работает...
(\w) ... \\1 - проверяет идентичность символов на концах строки
( (\w?) | (?R) ) - соотвествует:
либо пустой строке: \w{0},
либо одному символу: \w{1},
либо всей внутренней строке, если она подходит под общий рег: (?R).
насчет работоспособности последнего пункта во всех версиях php - не уверен
в перле данная возможность появилась в версии 5.6
проверял на PHP 5.0.4

подробнее можно почитать здесь
(разделы "Рекурсивные шаблоны" и "Обратные ссылки")

PM MAIL ICQ   Вверх
sugee
Дата 12.3.2006, 17:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 423
Регистрация: 12.6.2005

Репутация: нет
Всего: 4



Цитата(ZlojEzh @ 12.3.2006, 15:41 Найти цитируемый пост)
насчет работоспособности последнего пункта во всех версиях php - не уверен
В PHP 5.0.2 не работает.
Добавлено @ 17:16
Цитата(ZlojEzh @ 12.3.2006, 15:41 Найти цитируемый пост)
(\w) ... \\1 - проверяет идентичность символов на концах строки
Эта проверка тоже не срабатывает, пропускает строку с разными символами на концах.

PM MAIL   Вверх
ZlojEzh
Дата 14.3.2006, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.10.2005
Где: Киев, Украина

Репутация: 2
Всего: 15



мдя, лопухнулся...
надо еще задавать начало и конец строки, но как это сделать только для первой итерации рекурсии придумать пока не могу
PM MAIL ICQ   Вверх
CyClon
Дата 15.3.2006, 22:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 838
Регистрация: 3.12.2005

Репутация: 1
Всего: 4



^ - начало
$ - конец

Что такое полиндром?


--------------------
user posted image
PM   Вверх
ZlojEzh
Дата 15.3.2006, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.10.2005
Где: Киев, Украина

Репутация: 2
Всего: 15



палиндром - слово или фраза, читающаяся одинаково в обоих направлениях - слева направо и наоборот

проблема не в том чтоб просто задать проверку на начало и конец строки;
надо сделать так чтоб она выполнялась только на первой итерации
иначе регулярка работать отказывается работать

конечно, было бы лучше задать модификаторами необходимость совпадения рега с полной строкой, но такой фичи пока не нашел
есть только модификатор A - указывает искать совпадение с регом в начале строки


PM MAIL ICQ   Вверх
Drache
Дата 31.3.2006, 10:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 31.3.2006

Репутация: нет
Всего: 3



to ZlojEzh:
не только на концех. Если взять например строку assasa, то скажет, что все ок, но строка то неправильная.

Это сообщение отредактировал(а) Drache - 31.3.2006, 12:02
PM MAIL   Вверх
ZlojEzh
Дата 1.4.2006, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.10.2005
Где: Киев, Украина

Репутация: 2
Всего: 15



если не указывать условия на начало и конец строки, то регулярка #(\w)((\w?)|(?R))\\1# ищет первую подстроку-палиндром с длиной не меньше 2ух символов

интересная задачка - третью неделю сплю плохо ))
PM MAIL ICQ   Вверх
Drache
Дата 1.4.2006, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 73
Регистрация: 31.3.2006

Репутация: нет
Всего: 3



в общем! Если у тебя работает та регулярка, то проверь вот эту:

Код

$pat = "/(^(\w)((\w)|(?R))*\\2$)/";
if(preg_match($pat, $str, $mas)){
  echo $str.' - ok<br>';
  print_r($mas);
}else{
  echo $str.' - wrong';
}


потому что у меня твоя регулярка не работает как надо. Я так понимаю, что она если уже находит пару совпадений по краям слова, то считает, что все гуд, и если даже потом слово не совпадает (далее внутри), то регулярке уже пофиг, она не считает это за несовпадение.
Так что не знаю ... то ли у меня что-то с инерпретатором не то, то ли это рег. выражение все же работает не так как хотелось бы.
PM MAIL   Вверх
ZlojEzh
Дата 1.4.2006, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.10.2005
Где: Киев, Украина

Репутация: 2
Всего: 15



моя регулярка не проверяет всю строку - в этом-то и проблема
(тут ты абсолютно прав - работает не так, как хотелось smile )
она ищет первую подстроку-палиндром

"/(^(\w)((\w)|(?R))*\\2$)/" - пропускает строки типа 'abcbba'
то бишь проверяет только символы на концах строки ( ((\w)|(?R))* - фактически пропускает все, что укладывается в \w*; искать рекурсивные совпадения с полным шаблоном даже не пытается )
а если звездочку убрать - рег вообще не пашет на строках длиннее двух символов

PM MAIL ICQ   Вверх
skalex
Дата 6.4.2006, 12:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хороший человек
**


Профиль
Группа: Участник Клуба
Сообщений: 895
Регистрация: 2.4.2004

Репутация: 0
Всего: 23



Брррр ... Так-так ... smile

А вот мое решение:

Код
echo (preg_match('%^(.)(.)(.)\\3\\2\\1$%', 'abccba')) ? 'Палиндром' : 'Непалиндром';


Для наглядности использовал класс ".", т.е. любой символ. В действительности лучше заменить их на более реальный класс символов. Например, на [А-Яа-я].
PM   Вверх
ZlojEzh
Дата 6.4.2006, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 285
Регистрация: 8.10.2005
Где: Киев, Украина

Репутация: 2
Всего: 15



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

я уже начинаю сомневаться, возможно ли это вообще...
PM MAIL ICQ   Вверх
smartov
Дата 7.4.2006, 12:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 4
Всего: 259



sugee, а не проще ли исходить из ОПРЕДЕЛЕНИЯ полиндрома?
Код
Полиндром - фраза, которая читается с конца точно так же как и сначала

...и зачем нам регулярки....
Код


function isPolyndrom($string)
{
setlocale(LC_ALL, 'ru_RU');
    if ($string == strrev($string))
        return true;

    return false;
}



Одно но. В PHP ниже версии непомнюкакой strrev не работает с unicode строками.
Но если у тебя кодировка Win1251 то все в порядке.
PM MAIL   Вверх
skalex
Дата 7.4.2006, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Хороший человек
**


Профиль
Группа: Участник Клуба
Сообщений: 895
Регистрация: 2.4.2004

Репутация: 0
Всего: 23



Цитата
мы тут задачку по-интересней решаем - шаблон для палиндрома, не зависящий от длины строки
а твой вариант, к сожалению, работает только для шестисимвольной строки


Да? А я в первом сообщении написано:
Цитата
Нужно написать шаблон для полиндрома из шести букв


Цитата
шаблон для палиндрома, не зависящий от длины строки

Нереально имхо ... Только через strrev(), как и написал smartov ...
PM   Вверх
smartov
Дата 7.4.2006, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


свой собственный
****


Профиль
Группа: Экс. модератор
Сообщений: 4225
Регистрация: 2.2.2006
Где: NJ

Репутация: 4
Всего: 259



skalex,
Цитата(skalex @ 7.4.2006, 12:08 Найти цитируемый пост)
Только через strrev()

Внутренний настрой фразы подсказывает что ты считаешь этот вариант ущербным. Почему?
МОнжо и на регулярках. Делить пополам. Проверять и т.п.
Но зачем гемморой себе самом придумывать?
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




[ Время генерации скрипта: 0.0549 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.