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

Поиск:

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


Новичок



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

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



Задача такая: выделить в строке кусок между "text=" и "&". Например, из строки asdghtext=abcd&fgh надо выделить abcd. Эти строки хранятся в файле.
Для этого я использую регулярное выражение $line =~ m{\w+text=(\w+)&\w+};
Потом пытаюсь напечатать результат в файл для проверки print "$&\n"
В итоге получаю пустой файл, то есть регулярное выражение ничего не находит. В чем проблема?
Вот весь код
Код

while (defined(my $line = <INPUTFILE>)){
 chomp($line);
 $line =~ m{\w+text=(\w+)&\w+}; 
 print RESULT  "$&\n";
};

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


Опытный
**


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

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



УМВР, однако есть пара замечаний:
-- $& равна всему совпадению, чтобы получить только то, что в скобках, нужно использовать $1;
-- желательно поставить if, если есть вариант, когда в строке нету "text=...&";
-- если строка начинается с "text=", или заканчивается на "&", или между ними кусок содержит не только алфавитно-цифровые символы, то регулярка не совпадет. Если так и задумано, то ок, если нет, то 
Код
print "$1\n" if $line =~ /text=([^&]+)&/;

Возможно, проблема не в этом куске кода.


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
MARIA123
Дата 20.10.2011, 23:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Спасибо, часть ошибок исправила.
А возможно ли в регулярном выражении указать, что в начале строки может быть все что угодно,кроме слова text ?
[^text] запретит и строку ttttext

Добавлено через 11 минут и 32 секунды
[^(text)]+   тоже работать не хочет
PM MAIL   Вверх
JAPH
Дата 20.10.2011, 23:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Заработало? Пишет в файл?

Квадратные скобки совпадают с одним символом, так что [text] и [tex] это либо "t", либо "e", либо "x". Если нужно запретить строку, то можно использовать 
Код
/^(?!text)/
 (?!...) -- это утверждение нулевой ширины, которое означает, что с данной точки строки не может начинаться нечто в скобках. Если это единственная задача регулярки, лучше использовать 
Код
$str !~ /^text/
 или 
Код
0 != index $str, 'text'
 или 
Код
'text' ne substr $str, 0, 4
 TIMTOWTDI smile

Это сообщение отредактировал(а) JAPH - 21.10.2011, 00:03


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
MARIA123
Дата 21.10.2011, 00:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Интересные решения)
у меня в итоге получилось так ^(?:.+text=([^&]+)&[\d\D]+)  т.е. перед text может идти любой "мусор"
PM MAIL   Вверх
JAPH
Дата 21.10.2011, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Я бы сказал, не может, а должен, ибо стоит квантификатор +, причем жадный, т.е. если в строке несколько подходящих text=...&, будет найдено самое правое. Конструкция (?: ) тут лишняя, [\d\D] это просто точка (с модификатором /s, иначе точка не совпадает с символом "\n").


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
MARIA123
Дата 21.10.2011, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А если вхождений  text=...& несколько, как их все найти?
Не судите строго, первый раз мучаю регулярные выражения
PM MAIL   Вверх
alezzz
Дата 21.10.2011, 08:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


сплю...
**


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

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



Цитата(MARIA123 @  21.10.2011,  00:36 Найти цитируемый пост)
А если вхождений  text=...& несколько, как их все найти?

Не используйте жадный квантификатор. 
Покажите пример текста из по которому ведется поиск, и желательно пример приближенный к реальности, т.е. встречаются ли цифры в тексте, другие символы, как он расположен в строках (по одному на строку или несколько) и т.д.
PM MAIL   Вверх
MARIA123
Дата 21.10.2011, 09:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Большое спасибо за помощь.Справилась.
PM MAIL   Вверх
Google
  Дата 23.9.2017, 06:41 (ссылка)  





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


 




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


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

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