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


Увидели сообщение с непонятной ссылкой, спам, непристойность или оскорбление?
Воспользуйтесь ссылкой «Сообщить модератору» рядом с сообщением!

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

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

Оффлайн Verr

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

Оффлайн Sly_tom_cat

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

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

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

Оффлайн Azure

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

Оффлайн ReNzRv

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

Оффлайн Verr

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

Оффлайн ReNzRv

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

my $result = &find_text("cтрока", "текст", "Опциональный_текст", "добавка");
print "$result\n";

Оффлайн 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

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

 

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