| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Perl: Регулярные выражения > Не захватывать часть строки |
| Автор: Pfailed 23.2.2010, 11:53 | ||||
| Возможно ли не захватывать часть строки в захватывающих скобках? Пример:
Здесь я хотел бы чтобы захватывающие скобки при захвате пропустили "i*" и в результате получилось
Но как обозначить, что я не хочу захватывать "i*"? Я понимаю что можно сделать две пары захватывающих скобок и таким образом пропустить ненужные мне символы. Но меня интересует именно такой вариант, где я могу пропустить часть строки в захватывающих скобках. |
| Автор: Logo 23.2.2010, 15:50 | ||
Зачем две пары?
|
| Автор: Pfailed 23.2.2010, 15:56 |
| Мне необходимо помимо числа получить и его знак, как указано в первом сообщении. |
| Автор: Egik2 23.2.2010, 16:08 |
| Подозреваю, что какая бы извращенная фантазия не была у создателей Perlа, в том числе у Ларри Волла. До такого они не додумались |
| Автор: Logo 23.2.2010, 17:23 |
| Аа понял А чем не устраивают два сохранения? |
| Автор: Pfailed 23.2.2010, 17:42 |
| На мой взгляд получилось бы эстетичнее чем с двумя захватами. Интерес тут скорее теоретический, чем практический. Но думаю в будущем может пригодиться. |
| Автор: Pfailed 23.2.2010, 18:39 |
| http://stackoverflow.com/questions/277547/regular-expression-to-skip-character-in-capture-group, что это сделать невозможно. Что ж, жаль. |
| Автор: Logo 23.2.2010, 19:48 | ||||
Вовсе нет. Если одному захвату на самом деле соответствует два - никакой логики, запутаться на раз-два. Не встречал задачи где бы это пригодилось. Впрочем, если очень хочется, есть такой вариант
|
| Автор: Pfailed 23.2.2010, 20:18 | ||||||
Просто на днях писал на C++ и заюзал библиотеку регулярных выражений pcre. Вот в голову и пришла мысль, что если бы удалось пропустить ненужные мне символы в строке, то код бы мой слегка упростился, не нужно бы было заводить лишнюю переменную и проверять дополнительное условие:
А иначе приходится писать так:
В Perl конечно эта проблема менее актуальна, так как простые вещи здесь делаются просто.
Оригинально, но это не решает поставленную задачу. |
| Автор: vadiml 23.2.2010, 23:08 |
| А почему тогда просто не затирать i* ? $test1 = '+i*5'; $test1 =~ s/i\*//; # $test == '+5' |
| Автор: Pfailed 24.2.2010, 07:19 |
| Да понятно, что есть несколько способов добиться нужного результата. Просто было интересно, а можно ли сделать так как я предложил в первом сообщении. |
| Автор: Logo 25.2.2010, 18:09 | ||||
На C++ сталкиваться с регспами не приходилось. На Perl же просто делается конкатенация, $1.$2, да и на других высокоуровневых языках так же.
Почему же? - разве что захват теперь называется не $1, а $capture; Но кроме Perl ни где работать не будет. |