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


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

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

Оффлайн ubu12.04ntu

  • Автор темы
  • Участник
  • *
  • Сообщений: 103
    • Просмотр профиля
Как в тексте заменить слово 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) [Выделить]
#!/usr/bin/perl -w

use strict;
my ($a,$i) = ('aaa/Downloads/bbb/Downloads/ccc/Downloads/ddd',0);

while ($a =~ m/Downloads/) {
 $a =~ s/Downloads/$i/;
 $i++;
}

print "$a\n";

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

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
Код: (php) [Выделить]
<?php

$str 
file_get_contents('test');
$i 1;

while (
preg_match('/Downloads/ui'$str)) {
    
$str preg_replace('/Downloads/'$i$str1);
    
$i++;
}

echo 
$str;

Код: (python) [Выделить]
import string
import re

f = open("test", 'r')
n_text = f.read()
i = 1

while (re.search('Downloads', n_text)) :
    n_text = string.replace(n_text, 'Downloads', str(i), 1)
    i = i + 1

print(n_text)
Думаю на перле можно запилить что-то аналогичное, увы, но в нем я не очень силен
HP Pro 840 G3: Intel i5-6300U, 32GB DDR4 2133MHz, Intel 520, Intel Pro 2500 180GB/Ubuntu 22.04
Dell Latitude 5590: Intel i5-8350U, 16GB DDR4 2400MHz, Intel 620, Samsung 1TB/Ubuntu 22.04

Оффлайн ubu12.04ntu

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

Оффлайн EvangelionDeath

  • Администратор
  • Старожил
  • *
  • Сообщений: 3487
  • Ubuntu 22.04 х64
    • Просмотр профиля
ubu12.04ntu, а если вхождений более 50? И разве replace меняет только первое вхождение, по крайней мере в том виде, что у вас написано?
HP Pro 840 G3: Intel i5-6300U, 32GB DDR4 2133MHz, Intel 520, Intel Pro 2500 180GB/Ubuntu 22.04
Dell Latitude 5590: Intel i5-8350U, 16GB DDR4 2400MHz, Intel 620, Samsung 1TB/Ubuntu 22.04

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

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

Оффлайн ReNzRv

  • Старожил
  • *
  • Сообщений: 2648
    • Просмотр профиля
ubu12.04ntu,
Код: (bash) [Выделить]
echo 'Downloads my Downloads my Downloads' | perl -pe 's/Downloads/++$n/eg'
Пользователь добавил сообщение 19 Мая 2018, 23:13:29:
Код: (perl) [Выделить]
#!/usr/bin/env perl

$str='Downloads my Downloads my Downloads';

$str =~ s/Downloads/++$n/eg;

print "$str\n";
« Последнее редактирование: 19 Мая 2018, 23:13:29 от ReNzRv »

 

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