Форум русскоязычного сообщества Ubuntu


Автор Тема: RegExp - условную замену умеет?  (Прочитано 693 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Verr

  • Автор темы
  • Любитель
  • *
  • Сообщений: 67
    • Просмотр профиля
RegExp - условную замену умеет?
« : 26 Май 2017, 13:12:30 »
Поисковая строка типа (текст)(Опциональный_текст)?
Задача - если опциональный_текст найден, то вставить в результат между /1 и /2 некие дополнительные символы
Т.е. если на входе текст = то на выходе текст
А если на входе текст Опциональный_текст то на выходе текст_добавка_Опциональный_текст

Оффлайн Sly_tom_cat

  • Don't worry, be happy!
  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 12073
  • Xubuntu 20.04 (64bit)
    • Просмотр профиля
Re: RegExp - условную замену умеет?
« Ответ #1 : 26 Май 2017, 14:31:24 »
так вроде бы можно проще сформулировать.

Если найдена строка текст_опциональный_текст то _опциональный_текст заменить на _добавка_опциональный_текст

Индикатор для Yandex-Disk: https://forum.ubuntu.ru/index.php?topic=241992
UEFI-Boot - грузимся без загрузчика: http://help.ubuntu.ru/wiki/uefiboot

Оффлайн Azure

  • Модератор раздела
  • Старожил
  • *
  • Сообщений: 6015
  • Windows10, i3wm on Debian9, Manjaro20.0
    • Просмотр профиля
Re: RegExp - условную замену умеет?
« Ответ #2 : 26 Май 2017, 16:04:23 »
Или наоброт: Если найдена строка текст_опциональный_текст заменить текст_ на текст_добавка_
В Линукс можно сделать ВСЁ что угодно, достаточно знать КАК !

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2628
    • Просмотр профиля
Re: RegExp - условную замену умеет?
« Ответ #3 : 26 Май 2017, 23:02:39 »
Код: Perl
  1. /(текст)(Опциональный_текст)?/;
  2. if (defined $1) {
  3.         print "$1";
  4.         print " добавка $2" if (defined $2);
  5.         print "\n";
  6. }
  7.  
« Последнее редактирование: 26 Май 2017, 23:52:55 от renzrv »

Оффлайн Verr

  • Автор темы
  • Любитель
  • *
  • Сообщений: 67
    • Просмотр профиля
Re: RegExp - условную замену умеет?
« Ответ #4 : 27 Май 2017, 16:34:23 »
Да, можно было сформулировать и так, я слишком близко к реальной задаче взял.
renzrv, вопрос был именно про RegExp-поиск, скриптом-то постобработать оно как нефиг делать. К сожалению, инфа по нему больше касается того какую строку написать для поиска, а что можно сделать с найденным кроме как тупо вставить - непонятно.
« Последнее редактирование: 27 Май 2017, 16:40:02 от Verr »

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2628
    • Просмотр профиля
Re: RegExp - условную замену умеет?
« Ответ #5 : 29 Май 2017, 00:35:58 »
Verr,
В регулярках есть и замена, и условия типа if-else (Бен Форта: Регулярные выражения.), но совместить замену с условием я так понял - нельзя. Но еще можно применить такое решение:
Код: Perl
  1. sub find_text { $_[0] =~ /($_[1])($_[2])?/; ($1 && $2) ? "$1 $_[3] $2" : $1 };
  2.  
  3. my $result = &find_text("cтрока", "текст", "Опциональный_текст", "добавка");
  4. print "$result\n";
  5.  

Оффлайн rtupe

  • Новичок
  • *
  • Сообщений: 29
    • Просмотр профиля
Re: RegExp - условную замену умеет?
« Ответ #6 : 09 Июнь 2017, 15:37:47 »
Perl умеет заглядывать вперед и назад - look-ahead, look-behind регулярные выражения:

perl -le '
$_="1x12"; $text="1"; $opt="2"; $sub="X";
s/(?<=$text)(?=$opt)/$sub/;
print
'
1x1X2
Подробнее можно прочитать, допустим, здесь:
https://rsdn.org/article/alg/regular.xml#ENGAC
« Последнее редактирование: 09 Июнь 2017, 15:39:32 от rtupe »

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2628
    • Просмотр профиля
Re: RegExp - условную замену умеет?
« Ответ #7 : 10 Июнь 2017, 11:24:06 »
rtupe,
если на входе текст = то на выходе текст

 

Страница сгенерирована за 0.328 секунд. Запросов: 24.