Модераторы: ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Регулярные выражения, выделение с отсутствием вхождения 
V
    Опции темы
Anark1
Дата 27.7.2009, 19:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 622
Регистрация: 15.12.2006
Где: RF -> Moscow

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



Приветствую.
Не так давно начал изучать Perl.
Возник вопрос насчет выделения из строки, фрагмента, в котором отсутствует заданная подстрока.
Например, выделить из строки "<ABCD>EFG>" фрагмент "<ABCD>" следующим образом : от символа "<" до ">" с отсутствием "EFG".
Я использую
Код

s/<.*(EFG){0}>//;

этот код не работает (выделяет всю строку).
Я, очевидно, неправильно пытаюсь указать интерпретатору, что "EFG" отсутствует.
Прошу не закидывать тухлыми помидорами и не отправлять в поиск. Задача вроде бы для знающих не очень сложная.
Заранее спасибо.


--------------------
Enjoy yourself, still you can...;)

user posted image

user posted image
PM MAIL ICQ   Вверх
Itsys
Дата 27.7.2009, 19:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1338
Регистрация: 21.1.2008
Где: г. Москва

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



что значит "выделить"?

Если просто от символа < до символа >:
Код

s/\<([^\>]+)\>//

PM MAIL WWW Skype   Вверх
Logo
Дата 27.7.2009, 19:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Насколько понял задачу, нужно
Код

/<(?:(?!EFG).)*>/

PM MAIL   Вверх
ginnie
Дата 27.7.2009, 19:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Anark1, я сделал так

Код

my $test = "<ABCD>EF>";
print($test =~ /(.*)EFG/ ? $1 : $test);



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Anark1
Дата 27.7.2009, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 622
Регистрация: 15.12.2006
Где: RF -> Moscow

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



Itsys, не просто от и до. Думаю, ваш код также будет работать на примере, но мне нужен случай именно с отсутствием некоторой подстроки.


Logo, спасибо, не поясните немного? И заодно если не сложно, почему не работает мой вариант с квантификатором?


--------------------
Enjoy yourself, still you can...;)

user posted image

user posted image
PM MAIL ICQ   Вверх
ginnie
Дата 27.7.2009, 19:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

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



Anark1, Ваше выражение удаляет в строке все символы начиная с < и до конца строки.


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
Anark1
Дата 27.7.2009, 20:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 622
Регистрация: 15.12.2006
Где: RF -> Moscow

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



ginnie, да это я знаю smile меня интересует "почему".
Ладно, вопрос решен, всем спасибо.


--------------------
Enjoy yourself, still you can...;)

user posted image

user posted image
PM MAIL ICQ   Вверх
Logo
Дата 27.7.2009, 22:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Потому что там так напсано  smile вернее от < и до (EFG), совпадающего ноль раз, за которым идет >. Но поскольку совпадение с нулем (EFG) есть пустая строка, оно совпадает в любом месте, и это все равно что его вообще не писать. У меня в <> находится (?!EFG).)* любой символ, перед которым опережающая проверка на отсутствие EFG, сколь угодно раз.
PM MAIL   Вверх
Pori
Дата 21.8.2009, 23:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Валь, используй негативную опережающую проверку. Вот здесь все расписано, для начала самое оно:

Регулярки

А именно по твоему случаю - logo все правильно рассказал. Но если уж очень хочешь сделать через {0}, то можно:

Код

/<(.*?)(?:EFG){0}>/


не забывай ? - этим ты скажешь интерпретатору искать по минимуму. Ну или модификатор U

А с чего вдруг перл начал учить? 

Это сообщение отредактировал(а) Pori - 21.8.2009, 23:54
PM MAIL   Вверх
Logo
Дата 4.9.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Поправка
Код

/<(.*?)(?:EFG){0}>/

(?:EFG){0} Здесь погоды не делает, это аналогично
Код

/<(.*?)>/

Т.е. <ABCD EFG> заберет. 
Модификатора U в перле нет, это PHP.
PM MAIL   Вверх
Pori
Дата 6.9.2009, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата(Logo @ 4.9.2009,  14:06)
Поправка
Код

/<(.*?)(?:EFG){0}>/

(?:EFG){0} Здесь погоды не делает, это аналогично
Код

/<(.*?)>/

Т.е. <ABCD EFG> заберет. 
Модификатора U в перле нет, это PHP.

Знаю, что не делает - поэтому и написал, если очень хочется с {0}  smile

Сори модификатора U нет. Но все-равно нежадные регулярки никто не отменял ;)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Регулярные выражения | Следующая тема »


 




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


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

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