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


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

Автор Тема: Регулярное выражение perl (счетчик замены)  (Прочитано 463 раз)

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

Оффлайн ubu12.04ntu

  • Автор темы
  • Любитель
  • *
  • Сообщений: 91
    • Просмотр профиля
Как в тексте заменить слово Downloads на число, обозначающее номер его повторения? есть ли оператор счетчика совпадения?

было
Downloads my Downloads my Downloads
стало
1 my 2 my 3

« Последнее редактирование: 17 Май 2018, 17:24:41 от ubu12.04ntu »

Оффлайн Гамлиэль Фишкин

  • Участник
  • *
  • Сообщений: 153
  • Ubuntu MATE 16.04.4 x64 Ubuntu user since 2009
    • Просмотр профиля
    • about me
Код: Perl
  1. #!/usr/bin/perl -w
  2.  
  3. use strict;
  4. my ($a,$i) = ('aaa/Downloads/bbb/Downloads/ccc/Downloads/ddd',0);
  5.  
  6. while ($a =~ m/Downloads/) {
  7.  $a =~ s/Downloads/$i/;
  8.  $i++;
  9. }
  10.  
  11. print "$a\n";

возвращает aaa/0/bbb/1/ccc/2/ddd. Код работает, проверил. Мне самому этот код кажется выглядящим неуклюже, но
$a =~ s/Downloads/$i++/g;
не работает так, как хотелось бы, возвращая aaa/0++/bbb/0++/ccc/0++/ddd.

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3005
  • Ubuntu Mate 16.04 х64
    • Просмотр профиля
Код: PHP
  1. <?php
  2.  
  3. $str = file_get_contents('test');
  4. $i = 1;
  5.  
  6. while (preg_match('/Downloads/ui', $str)) {
  7.     $str = preg_replace('/Downloads/', $i, $str, 1);
  8.     $i++;
  9. }
  10.  
  11. echo $str;
  12.  

Код: Python
  1. import string
  2. import re
  3.  
  4. f = open("test", 'r')
  5. n_text = f.read()
  6. i = 1
  7.  
  8. while (re.search('Downloads', n_text)) :
  9.     n_text = string.replace(n_text, 'Downloads', str(i), 1)
  10.     i = i + 1
  11.  
  12. print(n_text)
  13.  
Думаю на перле можно запилить что-то аналогичное, увы, но в нем я не очень силен
Fujitsu UH552: Intel Core i3-3217U, 16GB DDR3 1600MHz, Intel HD4000, Intel 535 120GB/Ubuntu 16.04 Mate
HP 625: AMD Athlon P320, 4GB DDR3 1333MHz, AMD HD4250, Seagate Momentus/Ubuntu 14.04 Mate

Оффлайн ubu12.04ntu

  • Автор темы
  • Любитель
  • *
  • Сообщений: 91
    • Просмотр профиля
Спасибо.
Думаю, остановлюсь все-таки на js
Код: Javascript
  1. for (i=1;i<50;i++){var text=text.replace("Downloads", (" "+i))};
« Последнее редактирование: 17 Май 2018, 18:03:02 от ubu12.04ntu »

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3005
  • Ubuntu Mate 16.04 х64
    • Просмотр профиля
ubu12.04ntu, а если вхождений более 50? И разве replace меняет только первое вхождение, по крайней мере в том виде, что у вас написано?
Fujitsu UH552: Intel Core i3-3217U, 16GB DDR3 1600MHz, Intel HD4000, Intel 535 120GB/Ubuntu 16.04 Mate
HP 625: AMD Athlon P320, 4GB DDR3 1333MHz, AMD HD4250, Seagate Momentus/Ubuntu 14.04 Mate

Оффлайн Гамлиэль Фишкин

  • Участник
  • *
  • Сообщений: 153
  • Ubuntu MATE 16.04.4 x64 Ubuntu user since 2009
    • Просмотр профиля
    • about me
остановлюсь все-таки на js
Ой не советую! Вычисления, производимые на сервере, Вам подконтрольны, и если в Вашем коде нет ошибок, то сюрпризы более-менее исключены. От вычислений же в броузерах посетителей можно ждать чего угодно: там разные настройки, вплоть до отключённого JavaScript'а. (Да, в коде сервера и настройках хостера могут появиться ошибки, но у Вас сервер один и хостер один, и за их обновлениями Вы, в принципе, можете уследить; но никто не может предвидеть, какая муха укусит завтра разработчиков того или иного броузера.)

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 1882
    • Просмотр профиля
ubu12.04ntu,
Код: Bash
  1. echo 'Downloads my Downloads my Downloads' | perl -pe 's/Downloads/++$n/eg'

Пользователь добавил сообщение 19 Май 2018, 23:13:29:
Код: Perl
  1. #!/usr/bin/env perl
  2.  
  3. $str='Downloads my Downloads my Downloads';
  4.  
  5. $str =~ s/Downloads/++$n/eg;
  6.  
  7. print "$str\n";
  8.  
« Последнее редактирование: 19 Май 2018, 23:13:29 от ReNzRv »

 

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