Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Работа с рег. выражениями 
V
    Опции темы
prog2
Дата 7.1.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Знаком с руби очень мало. В универе дали задания все решил, только вот с одним проблема. Дан URL-адрес, требуется вывести только домен. Сделать это нужно макс 20-25 символов, т.е с использованием рег выражений. Бился над этой задачей очень долго и не смог ее одолеть. Помогите пож-та. Заранее благодарен. 

Если это возможно сделать без рег. выражений - тоже можно главное чтобы длина программы была как можно короткой

Это сообщение отредактировал(а) prog2 - 7.1.2008, 17:06
PM MAIL   Вверх
source777
Дата 7.1.2008, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

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



Так сойдёт?
Код

  url="http://forum.vingrad.ru/forum/topic-190317.html";
  print url.sub(/.*?\/{2}(.*?)(\/|$).*/, '\1');


Добавлено через 8 минут и 52 секунды
Или ещё компактнее:
Код

  url="http://forum.vingrad.ru/forum/topic-190317.html";
  print url.scan(/\/\/([^\/]*)/);



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
prog2
Дата 7.1.2008, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А так что бы на выходе было не forum.vingrad.ru , а vingrad.ru
PM MAIL   Вверх
source777
Дата 7.1.2008, 20:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

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



Цитата

А так что бы на выходе было не forum.vingrad.ru , а vingrad.ru 

Так тоже можно, только 20-25 символов у тебя лимит на весь(вместе с print url.) код или эксклюзивно для регулярного выражения? А то один регэксп уже 31 символ занимает, а сокращать его особо некуда...
Код

  print url.sub(/.*?\\/\\/([^\\/]*?\\.)+([^\\/]*).*/, \'\\1\\2\'); # vingrad.ru


Добавлено через 11 минут и 9 секунд
На вдогонку вариант для scan
Код

  print url.scan(/\\/\\/([^\\/]*?\\.)+([^\\/]*)/); # vingrad.ru



--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
prog2
Дата 7.1.2008, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(source777 @ 7.1.2008,  20:04)
Цитата

А так что бы на выходе было не forum.vingrad.ru , а vingrad.ru 

Так тоже можно, только 20-25 символов у тебя лимит на весь(вместе с print url.) код или эксклюзивно для регулярного выражения? А то один регэксп уже 31 символ занимает, а сокращать его особо некуда...
Код

  print url.sub(/.*?\\/\\/([^\\/]*?\\.)+([^\\/]*).*/, \'\\1\\2\'); # vingrad.ru


Добавлено @ 20:15
На вдогонку вариант для scan
Код

  print url.scan(/\\/\\/([^\\/]*?\\.)+([^\\/]*)/); # vingrad.ru

Выдает ошибку:
C:/ruby/bin/1.rb:2: warning: regexp has `]' without escape
C:/ruby/bin/1.rb:2: unmatched ): /]*?\\.)+([^\\/
C:/ruby/bin/1.rb:2: parse error, unexpected ']', expecting ')'

Добавлено через 10 минут и 57 секунд
Лимит без учета print url
PM MAIL   Вверх
source777
Дата 7.1.2008, 22:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

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



Цитата

Выдает ошибку:
C:/ruby/bin/1.rb:2: warning: regexp has `]\' without escape
C:/ruby/bin/1.rb:2: unmatched ): /]*?\\\\.)+([^\\\\/
C:/ruby/bin/1.rb:2: parse error, unexpected \']\', expecting \')\'

Ну ты сам то совсем в регэкспах не разбираешься что ли? это форум что-то обратный слеш продубрировал везде с какого-то перепугу...
Код

  print url.scan(/\\/\\/([^\\/]*?\\.)+([^\\/]*)/); 

24 символа без учёта границ получается...

Добавлено через 1 минуту и 32 секунды
Блин, опять обратный слеш дублируется... 

P.S. Модераторы ау, обратите внимание на баг...


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
prog2
Дата 8.1.2008, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А по-другому как то можно эту задачу решить. Без регулярных выражений. Просто последний вариант то же не подходит. Это должно работать для любых URL адресов
PM MAIL   Вверх
tek
Дата 11.1.2008, 00:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Мой вариант :
Код


url = 'http://blah.site.ru/fasd?fa=222.php'
p $1 if url =~ /\/\/(.*?)\// 



результат : blah.site.ru

Вырезать site.ru - можно, но в вашем случае врятле кто-то напишет универсальный регексп, который будет всегда вытягивать "site.ru"
тем более в 25 символов.
Вдруг там -  www.yyy.zzz.ok.cz или http://www.xxx.yyy.ZZZ.NET.RU - а вам нужно "ZZZ.NET.RU".
PM MAIL   Вверх
shine
Дата 11.1.2008, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



На самом деле все проще:
Код

puts url.scan(/\/\/.*\.(.*\..*?)\//)

21 символ
hint: ищем последнее минимальное вхождение последовательности символы+точка+символы между двумя слэшами и одним

Это сообщение отредактировал(а) shine - 11.1.2008, 11:40
--------------------
An investment in knowledge always pays the best interest. © Benjamin Franklin
PM MAIL   Вверх
source777
Дата 11.1.2008, 21:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

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



shine, твой пример тоже не сработает верно на http://www.xxx.yyy.ZZZ.NET.RU (с) tek и даже на http://vingrad.ru тоже не сработает ;) корректную реализацию модернизированной идеи, которую ты описал в хинте можно увидеть в моём посте чуть выше(она там 24 символа заняла)

Я думаю можно даже сказать, что в самом общем случае эта задача не разрешима, нужны какие-либо начальные допущения, либо полное снятие ограничений на размеры регэкспа, ибо он на целый экран потянет(за счёт перечисления нынедействующих доменных зон), а может и больше...

Это сообщение отредактировал(а) source777 - 11.1.2008, 21:32


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
prog2
Дата 13.1.2008, 01:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Всем спасибо! Помогло - 
Код

puts url.scan(/\/\/.*\.(.*\..*?)\//) (с) shine

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


Новичок



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

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



prog2, хоршо конечно что вам помогло, но тема сисек не раскрыта  smile 

Не работат же пример shine если зона - net.ru, org.cn и т.п.

 smile 
PM MAIL   Вверх
source777
Дата 13.1.2008, 16:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1878
Регистрация: 12.3.2007

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



Цитата

Не работат же пример shine если зона - net.ru, org.cn и т.п.
да, он вообще не работает, если одиночного слеша в URL нет...
И вопрос к prog2, почему тогда мой вариант, работающий для более широкого класса допустимых URL, тебе не подошёл?


--------------------
Если бы программистам платили за то, чтобы убирать код из программы вместо того, чтобы добавлять его, программы были бы намного лучше © Николас Негропонте
PM MAIL   Вверх
shine
Дата 13.1.2008, 18:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(tek @ 13.1.2008,  12:57)
prog2, хоршо конечно что вам помогло, но тема сисек не раскрыта  smile 

Не работат же пример shine если зона - net.ru, org.cn и т.п.

 smile

Так а я и не прошу мне давать медаль 'за раскрытие сисек' smile
Твой вариант не будет работать если в url входит поддомен  smile 

Вобщем, как тут уже говорилось, универсального короткого решения создать не получится по-любому. Мое помогло - я рад.
--------------------
An investment in knowledge always pays the best interest. © Benjamin Franklin
PM MAIL   Вверх
130
Дата 24.1.2008, 00:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот так короче всего smile

Код

link = 'http://forum.vingrad.ru/forum/ruby-basics.html'
URI( link ).host #=> "forum.vingrad.ru"


Или:

Код

link = 'http://forum.vingrad.ru/forum/ruby-basics.html'
URI( link ).host.split( '.' ).last( 2 ).join( '.' ) #=> "vingrad.ru"


PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Ruby: Общие вопросы"
source777
  • С чего начать? начинаем
  • Ссылки на полезные ресурсы смотрим тут
  • Обязательно следуйте правилам Vingrad.
  • Пожалуйста, прочитайте рекомендации по работе в форуме и навигации по Vingrad.
  • Для вставки кодов Ruby используйте тег: [code=ruby]код[/code]. Когда в будущем подсветка синтаксиса для Ruby будет реализована, весь исходных код преобразится.
  • Используйтe чекбокс "Транслит" (возле кнопок кодов), если у Вас нет русских шрифтов.
  • Помните, для каждого вопроса должна быть своя тема.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, source777.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Ruby: Общие вопросы | Следующая тема »


 




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


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

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