![]() |
|
Модераторы: ginnie |
![]()
|
|
| MARIA123 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 20.10.2011 Репутация: нет Всего: нет |
Задача такая: выделить в строке кусок между "text=" и "&". Например, из строки asdghtext=abcd&fgh надо выделить abcd. Эти строки хранятся в файле.
Для этого я использую регулярное выражение $line =~ m{\w+text=(\w+)&\w+}; Потом пытаюсь напечатать результат в файл для проверки print "$&\n" В итоге получаю пустой файл, то есть регулярное выражение ничего не находит. В чем проблема? Вот весь код
|
|||
|
||||
| JAPH |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: нет Всего: 23 |
УМВР, однако есть пара замечаний:
-- $& равна всему совпадению, чтобы получить только то, что в скобках, нужно использовать $1; -- желательно поставить if, если есть вариант, когда в строке нету "text=...&"; -- если строка начинается с "text=", или заканчивается на "&", или между ними кусок содержит не только алфавитно-цифровые символы, то регулярка не совпадет. Если так и задумано, то ок, если нет, то
Возможно, проблема не в этом куске кода. -------------------- Что непонятно - спрашиваем |
|||
|
||||
| MARIA123 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 20.10.2011 Репутация: нет Всего: нет |
Спасибо, часть ошибок исправила.
А возможно ли в регулярном выражении указать, что в начале строки может быть все что угодно,кроме слова text ? [^text] запретит и строку ttttext Добавлено через 11 минут и 32 секунды [^(text)]+ тоже работать не хочет |
|||
|
||||
| JAPH |
|
||||||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: нет Всего: 23 |
Заработало? Пишет в файл?
Квадратные скобки совпадают с одним символом, так что [text] и [tex] это либо "t", либо "e", либо "x". Если нужно запретить строку, то можно использовать
Это сообщение отредактировал(а) JAPH - 21.10.2011, 00:03 -------------------- Что непонятно - спрашиваем |
||||||||
|
|||||||||
| MARIA123 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 20.10.2011 Репутация: нет Всего: нет |
Интересные решения)
у меня в итоге получилось так ^(?:.+text=([^&]+)&[\d\D]+) т.е. перед text может идти любой "мусор" |
|||
|
||||
| JAPH |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 312 Регистрация: 8.1.2007 Где: Ленобласть Репутация: нет Всего: 23 |
Я бы сказал, не может, а должен, ибо стоит квантификатор +, причем жадный, т.е. если в строке несколько подходящих text=...&, будет найдено самое правое. Конструкция (?: ) тут лишняя, [\d\D] это просто точка (с модификатором /s, иначе точка не совпадает с символом "\n").
-------------------- Что непонятно - спрашиваем |
|||
|
||||
| MARIA123 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 20.10.2011 Репутация: нет Всего: нет |
А если вхождений text=...& несколько, как их все найти?
Не судите строго, первый раз мучаю регулярные выражения |
|||
|
||||
| alezzz |
|
|||
![]() сплю... ![]() ![]() Профиль Группа: Участник Сообщений: 499 Регистрация: 17.8.2009 Репутация: 11 Всего: 14 |
Не используйте жадный квантификатор. Покажите пример текста из по которому ведется поиск, и желательно пример приближенный к реальности, т.е. встречаются ли цифры в тексте, другие символы, как он расположен в строках (по одному на строку или несколько) и т.д. |
|||
|
||||
| MARIA123 |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 9 Регистрация: 20.10.2011 Репутация: нет Всего: нет |
Большое спасибо за помощь.Справилась.
|
|||
|
||||
![]()
|
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Perl: Регулярные выражения | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |