Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Регулярные выражения > проблемы с регулярным выражением


Автор: MARIA123 20.10.2011, 22:34
Задача такая: выделить в строке кусок между "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";
};

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

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

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

Добавлено через 11 минут и 32 секунды
[^(text)]+   тоже работать не хочет

Автор: JAPH 20.10.2011, 23:54
Заработало? Пишет в файл?

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

Автор: MARIA123 21.10.2011, 00:05
Интересные решения)
у меня в итоге получилось так ^(?:.+text=([^&]+)&[\d\D]+)  т.е. перед text может идти любой "мусор"

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

Автор: MARIA123 21.10.2011, 00:36
А если вхождений  text=...& несколько, как их все найти?
Не судите строго, первый раз мучаю регулярные выражения

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

Не используйте жадный квантификатор. 
Покажите пример текста из по которому ведется поиск, и желательно пример приближенный к реальности, т.е. встречаются ли цифры в тексте, другие символы, как он расположен в строках (по одному на строку или несколько) и т.д.

Автор: MARIA123 21.10.2011, 09:16
Большое спасибо за помощь.Справилась.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)