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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Не захватывать часть строки, в захватывающих скобках 
:(
    Опции темы
Pfailed
Дата 23.2.2010, 11:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Возможно ли не захватывать часть строки в захватывающих скобках?
Пример:
Код

$test1 = '+i*5';
$test2 = '-i*8';

$regexp = qr/((?:\+|-)i\*\d)/;
$test1 =~ $regexp or die;
warn $1;
$test2 =~ $regexp or die;
warn $1;


Здесь я хотел бы чтобы захватывающие скобки при захвате пропустили "i*" и в результате получилось
Код

+5
-8


Но как обозначить, что я не хочу захватывать "i*"?
Я понимаю что можно сделать две пары захватывающих скобок и таким образом пропустить ненужные мне символы. Но меня интересует именно такой вариант, где я могу пропустить часть строки в захватывающих скобках.


--------------------
PM MAIL   Вверх
Logo
Дата 23.2.2010, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Зачем две пары?
Код

qr/(?:\+|-)i\*(\d)/;
#а лучше
qr/[+-]i\*(\d)/;

PM MAIL   Вверх
Pfailed
Дата 23.2.2010, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Мне необходимо помимо числа получить и его знак, как указано в первом сообщении.


--------------------
PM MAIL   Вверх
Egik2
Дата 23.2.2010, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Подозреваю, что какая бы извращенная фантазия не была у создателей Perlа, в том числе у Ларри Волла.
До такого они не додумались  smile.



--------------------
Три великие добродетели программиста: лень, нетерпение и самомнение (Larry Wall)
a-nav.com
developer-blog.ru
world-poetry.org
PM MAIL WWW ICQ   Вверх
Logo
Дата 23.2.2010, 17:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Аа понял smile. Действительно, это ж надо додуматься.
А чем не устраивают два сохранения?
PM MAIL   Вверх
Pfailed
Дата 23.2.2010, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



На мой взгляд получилось бы эстетичнее чем с двумя захватами.
Интерес тут скорее теоретический, чем практический. Но думаю в будущем может пригодиться.


--------------------
PM MAIL   Вверх
Pfailed
Дата 23.2.2010, 18:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нашел подтверждение, что это сделать невозможно. Что ж, жаль.


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


Опытный
**


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

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



Цитата

На мой взгляд получилось бы эстетичнее


Вовсе нет. Если  одному захвату на самом деле соответствует два - никакой логики, запутаться на раз-два.

Не встречал задачи где бы это пригодилось.

Впрочем, если очень хочется, есть такой вариант
Код

$test1 = '+i*5';
$test2 = '-i*8';

our $capture;
$regexp = qr/([+-]i\*\d)(?{($capture = $^N)=~ s%i\*%%})/;
$test1 =~ $regexp or die;
warn $capture;
$test2 =~ $regexp or die;
warn $capture;


PM MAIL   Вверх
Pfailed
Дата 23.2.2010, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(Logo @  23.2.2010,  19:48 Найти цитируемый пост)
Не встречал задачи где бы это пригодилось.


Просто на днях писал на C++ и заюзал библиотеку регулярных выражений pcre. Вот в голову и пришла мысль, что если бы удалось пропустить ненужные мне символы в строке, то код бы мой слегка упростился, не нужно бы было заводить лишнюю переменную и проверять дополнительное условие:
Код

std::string test = "+i*10";
pcrecpp::RE regexp("([+-]i\\*\\d+)");
int im;

if(regexp.FullMatch(test, &im))
{
     //...
}


А иначе приходится писать так:
Код

std::string test = "+i*10", sign;
pcrecpp::RE regexp("([+-])i\\*(\\d+)");
int im;

if(regexp.FullMatch(test, &sign, &im))
{
   if(sign == "-")
   {
        im = -im;
   }
   //...
}



В Perl конечно эта проблема менее актуальна, так как простые вещи здесь делаются просто.

Код

$regexp = qr/([+-]i\*\d)(?{($capture = $^N)=~ s%i\*%%})/;


Оригинально, но это не решает поставленную задачу.


--------------------
PM MAIL   Вверх
vadiml
Дата 23.2.2010, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А почему тогда просто не затирать i* ?

$test1 = '+i*5';
$test1 =~ s/i\*//;
# $test == '+5'

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


Опытный
**


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

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



Да понятно, что есть несколько способов добиться нужного результата. Просто было интересно, а можно ли сделать так как я предложил в первом сообщении.


--------------------
PM MAIL   Вверх
Logo
Дата 25.2.2010, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата

Просто на днях писал на C++ и заюзал библиотеку регулярных выражений pcre. Вот в голову и пришла мысль, что если бы удалось пропустить ненужные мне символы в строке, то код бы мой слегка упростился, не нужно бы было заводить лишнюю переменную и проверять дополнительное условие:


На C++ сталкиваться с регспами не приходилось. На Perl же просто делается конкатенация, $1.$2, да и на других высокоуровневых языках так же.

Цитата

Оригинально, но это не решает поставленную задачу. 

Почему же? - разве что захват теперь называется не $1, а $capture;  Но кроме Perl ни где работать не будет.

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


 




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


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

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