![]() |
|
Модераторы: Aliance, skyboy, MoLeX, ksnk |
![]()
|
|
| sugee |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 423 Регистрация: 12.6.2005 Репутация: нет Всего: 4 |
В одном учебнике встретил задачу по регулярным выражениям.
Нужно написать шаблон для полиндрома из шести букв. Я ее вроде решил, но по условию нужно было уже в самой регулярке проверить что строка является полиндромом. Вот как бы это сделать?
|
|||
|
||||
| ZlojEzh |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.10.2005 Где: Киев, Украина Репутация: 2 Всего: 15 |
попробую объяснить, как этот рег работает... (\w) ... \\1 - проверяет идентичность символов на концах строки ( (\w?) | (?R) ) - соотвествует: либо пустой строке: \w{0}, либо одному символу: \w{1}, либо всей внутренней строке, если она подходит под общий рег: (?R). насчет работоспособности последнего пункта во всех версиях php - не уверен в перле данная возможность появилась в версии 5.6 проверял на PHP 5.0.4 подробнее можно почитать здесь (разделы "Рекурсивные шаблоны" и "Обратные ссылки") |
||||
|
|||||
| sugee |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 423 Регистрация: 12.6.2005 Репутация: нет Всего: 4 |
||||
|
||||
| ZlojEzh |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.10.2005 Где: Киев, Украина Репутация: 2 Всего: 15 |
мдя, лопухнулся...
надо еще задавать начало и конец строки, но как это сделать только для первой итерации рекурсии придумать пока не могу |
|||
|
||||
| CyClon |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 838 Регистрация: 3.12.2005 Репутация: 1 Всего: 4 |
^ - начало
$ - конец Что такое полиндром? |
|||
|
||||
| ZlojEzh |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.10.2005 Где: Киев, Украина Репутация: 2 Всего: 15 |
палиндром - слово или фраза, читающаяся одинаково в обоих направлениях - слева направо и наоборот
проблема не в том чтоб просто задать проверку на начало и конец строки; надо сделать так чтоб она выполнялась только на первой итерации иначе регулярка работать отказывается работать конечно, было бы лучше задать модификаторами необходимость совпадения рега с полной строкой, но такой фичи пока не нашел есть только модификатор A - указывает искать совпадение с регом в начале строки |
|||
|
||||
| Drache |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 31.3.2006 Репутация: нет Всего: 3 |
to ZlojEzh:
не только на концех. Если взять например строку assasa, то скажет, что все ок, но строка то неправильная. Это сообщение отредактировал(а) Drache - 31.3.2006, 12:02 |
|||
|
||||
| ZlojEzh |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.10.2005 Где: Киев, Украина Репутация: 2 Всего: 15 |
если не указывать условия на начало и конец строки, то регулярка #(\w)((\w?)|(?R))\\1# ищет первую подстроку-палиндром с длиной не меньше 2ух символов
интересная задачка - третью неделю сплю плохо )) |
|||
|
||||
| Drache |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 73 Регистрация: 31.3.2006 Репутация: нет Всего: 3 |
в общем! Если у тебя работает та регулярка, то проверь вот эту:
потому что у меня твоя регулярка не работает как надо. Я так понимаю, что она если уже находит пару совпадений по краям слова, то считает, что все гуд, и если даже потом слово не совпадает (далее внутри), то регулярке уже пофиг, она не считает это за несовпадение. Так что не знаю ... то ли у меня что-то с инерпретатором не то, то ли это рег. выражение все же работает не так как хотелось бы. |
|||
|
||||
| ZlojEzh |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.10.2005 Где: Киев, Украина Репутация: 2 Всего: 15 |
моя регулярка не проверяет всю строку - в этом-то и проблема
(тут ты абсолютно прав - работает не так, как хотелось она ищет первую подстроку-палиндром "/(^(\w)((\w)|(?R))*\\2$)/" - пропускает строки типа 'abcbba' то бишь проверяет только символы на концах строки ( ((\w)|(?R))* - фактически пропускает все, что укладывается в \w*; искать рекурсивные совпадения с полным шаблоном даже не пытается ) а если звездочку убрать - рег вообще не пашет на строках длиннее двух символов |
|||
|
||||
| skalex |
|
|||
|
Хороший человек ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 895 Регистрация: 2.4.2004 Репутация: 0 Всего: 23 |
Брррр ... Так-так ...
А вот мое решение:
Для наглядности использовал класс ".", т.е. любой символ. В действительности лучше заменить их на более реальный класс символов. Например, на [А-Яа-я]. |
|||
|
||||
| ZlojEzh |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 285 Регистрация: 8.10.2005 Где: Киев, Украина Репутация: 2 Всего: 15 |
мы тут задачку по-интересней решаем - шаблон для палиндрома, не зависящий от длины строки
а твой вариант, к сожалению, работает только для шестисимвольной строки я уже начинаю сомневаться, возможно ли это вообще... |
|||
|
||||
| smartov |
|
||||
![]() свой собственный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4225 Регистрация: 2.2.2006 Где: NJ Репутация: 4 Всего: 259 |
sugee, а не проще ли исходить из ОПРЕДЕЛЕНИЯ полиндрома?
...и зачем нам регулярки....
Одно но. В PHP ниже версии непомнюкакой strrev не работает с unicode строками. Но если у тебя кодировка Win1251 то все в порядке. |
||||
|
|||||
| skalex |
|
||||||
|
Хороший человек ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 895 Регистрация: 2.4.2004 Репутация: 0 Всего: 23 |
Да? А я в первом сообщении написано:
Нереально имхо ... Только через strrev(), как и написал smartov ... |
||||||
|
|||||||
| smartov |
|
|||
![]() свой собственный ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4225 Регистрация: 2.2.2006 Где: NJ Репутация: 4 Всего: 259 |
||||
|
||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | PHP: Тексты | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |