Модераторы: 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   Вверх
skalex
Дата 7.4.2006, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



smartov, отнюдь не считаю ущербным ... Да и вообще чушь - писать регулярное выражение для палиндрома, если того не требует задача в учебнике. smile
PM   Вверх
ZlojEzh
Дата 7.4.2006, 15:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



мдя, про шесть букв в задании я проглядел...

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

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

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


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


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

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



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


Я на регулярках уже собаку съел (разве что условия пока не особо использую) и не советую ломать голову по этому поводу ... smile
PM   Вверх
ZlojEzh
Дата 8.4.2006, 10:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(skalex @ 7.4.2006, 15:42 Найти цитируемый пост)
Я на регулярках уже собаку съел (разве что условия пока не особо использую) и не советую ломать голову по этому поводу ...  emo&:)endemo

Нерешаемая задача, что ли?

у меня уже большинство тестов проходятся
только с тремя одинаковыми буквами в начале строки глючит
сижу вот, голову ломаю ))

Код

  $tests = array(
    "ab",
    "abcde",
    "aa",
    "aba",
    "ababa",
    "abaaba",
    "abcba",
    "aaab",
    "abccbba",
    "aabaa",
    "ababababa",
    "aabbaa",
    "aabbbaa",
    "ckcbbbbbbckc",
    "aaabaaa",
    "aaabbaaa",
    "aaabbbaaa",
    "aaabbcbbaaa",
    "abcdefgfedcba",
    "abccbaabccba"
  );
  $re = "#  (\w)  ( (\w?) | (?R) )  \\1 (?(R)|$)  #Ax";

  foreach ($tests as $test) {
    print $test.((strlen($test)>=8)?"\t":"\t\t")." - ";
    if (preg_match($re,$test,$match)) {
      print "palindrom";
      if ($test==strrev($test)) {
        print "\t  ok";
      } else {
        print "\t  error";
      }
    } else {
      print "ne palindrom";
      if ($test==strrev($test)) {
        print "\t  error";
      } else {
        print "\t  ok";
      }
    }
    print "\n";
  }


Output:
Код

ab               - ne palindrom   ok
abcde            - ne palindrom   ok
aa               - palindrom      ok
aba              - palindrom      ok
ababa            - palindrom      ok
abaaba           - palindrom      ok
abcba            - palindrom      ok
aaab             - ne palindrom   ok
abccbba          - ne palindrom   ok
aabaa            - palindrom      ok
ababababa        - palindrom      ok
aabbaa           - palindrom      ok
aabbbaa          - palindrom      ok
ckcbbbbbbckc     - palindrom      ok
aaabaaa          - ne palindrom   error
aaabbaaa         - ne palindrom   error
aaabbbaaa        - ne palindrom   error
aaabbcbbaaa      - ne palindrom   error
abcdefgfedcba    - palindrom      ok
abccbaabccba     - ne palindrom   error

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


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


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

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



Наверное приятное занятие smile микроскопом гвозди забивать smile
PM MAIL   Вверх
ZlojEzh
Дата 8.4.2006, 11:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



нефиг выгоняться ))
в регулярках таким способом можно очень хорошо разобраться

если получится с палиндромом - открою новую тему с извращенскими задачками не регекспы
уже несколько придумал:
- проверка корректности математической формулы
- разложение XML-документа в массив (вряд ли получится - рекурсия записывает новые совпадения поверх старых, а без рекурсии такой штуки не сделашь)
PM MAIL ICQ   Вверх
smartov
Дата 8.4.2006, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



ZlojEzh,
Цитата(ZlojEzh @ 8.4.2006, 10:10 Найти цитируемый пост)
с извращенскими задачками не регекспы

Поиск матерных слов в тексте включая все их полиморфические формы русского языка smile

Извини это конечно правильно разобраться. Регулярки сила.
Но применять инструмент следует по назначению.
Разве что у тебя много времени и мало опыта.... тогда да
PM MAIL   Вверх
AbellarLindsey
Дата 25.4.2006, 05:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а если перечислить все буквы через или? не будет работать?
PM MAIL ICQ   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Тексты | Следующая тема »


 




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


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

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