Я могу заменить несколькими объектами в единственном регулярном выражении в VIM или Perl?

Это действительно жадный подход, но вам нужно поменять местами порядок if-then-else. В общем, жадный означает потреблять в текущий момент самое большое количество, которое вы можете потреблять.

Вам нужно сначала проверить самую большую монету. Нет необходимости в цикле while.

if(sum>=100) {
  hundreds=sum/100;
  sum-=hundreds*100;
}
if(sum>=10){
  tens=sum/10;
  sum-=tens*10;
} 
ones = sum; 
28
задан Ciro Santilli 新疆改造中心法轮功六四事件 19 November 2015 в 08:46
поделиться

6 ответов

Вторая часть подстановки - это строка в двойных кавычках, поэтому может произойти любая нормальная интерполяция. Это означает, что вы можете использовать значение захвата для индексации в хеш:

#!/usr/bin/perl

use strict;
use warnings;


my %replace = (
    quick => "slow",
    lazy  => "energetic",
);

my $regex = join "|", keys %replace;
$regex = qr/$regex/;

my $s = "The quick brown fox jumps over the lazy dog";

$s =~ s/($regex)/$replace{$1}/g;

print "$s\n";
32
ответ дан 28 November 2019 в 02:19
поделиться

Вы можете сделать это в Vim, используя Словарь:

:%s/quick\|lazy/\={'quick':'slow','lazy':'energetic'}[submatch(0)]/g

Это изменит следующий текст:

быстрый бурый лис бежал быстрый рядом с ленивым ручьем.

в :

медленный бурый лис бежал медленно рядом с энергичным ручьем.

Чтобы увидеть, как это работает, см. : help выражение подстановки и : справочный словарь . Короче говоря,

  • \ = позволяет заменить в результате выражения vim.
  • {'быстрый': 'медленный', 'ленивый': 'энергичный' } - это словарь vim (например, хеш в perl или ruby ​​или объект в javascript), который использует [] для поиска.
  • submatch (0) - совпавшая строка

Это может пригодиться при рефакторинге кода - допустим, вы хотите обменять имена переменных на foo , bar и baz изменение

  • foo bar
  • bar baz
  • baz foo

Использование последовательность команд % s /// была бы хитрой, если бы вы не использовали временные имена переменных - но вы должны были бы убедиться, что они не ударяются ни о чем другом. Вместо этого вы можете использовать словарь, чтобы сделать это за один проход:

:%s/\<\%(foo\|bar\|baz\)\>/\={'foo':'bar','bar':'baz','baz':'foo'}[submatch(0)]/g

, который изменяет этот код

int foo = 0;
float bar = pow(2.0, (float) foo);
char baz[256] = {};

sprintf(baz,"2^%d = %f\n", foo, bar);

на:

int bar = 0;
float baz = pow(2.0, (float) bar);
char foo[256] = {};

sprintf(foo,"2^%d = %f\n", bar, baz);

Если вы обнаружите, что делаете это много, вы можете добавить следующее к ~ / .vimrc : менее повторяющийся, чем создание регулярного выражения для dict вручную.

50
ответ дан 28 November 2019 в 02:19
поделиться

Вы можете сделать следующее.

:%s/quick\(.*\)lazy/slow\1energetic

Хитрость заключается в использовании паренсов для сопоставления текста между двумя словами. Затем вы можете сослаться на этот текст в строке подстановки, используя \1. Вы также можете использовать \2 для второго паренсного выражения и так далее. Это позволит вам заменить несколько слов, не нарушая текст между ними.

8
ответ дан 28 November 2019 в 02:19
поделиться

Ответ Часа хорош, единственное, что я хотел бы упомянуть, это то, что если вы делаете обмен словами, вы, вероятно, хочу найти соответствие на

\ b (foo | bar | baz | qux) \ b

, чтобы избежать совпадения подстрок. Если вы выполняете много замены слова, вы можете начать находить регулярные выражения с некоторым ограничением и захотите сделать что-то вроде:

join '', map { exists $subst{$_} ? $subst{$_} : $_ } split /\b/, $string
0
ответ дан 28 November 2019 в 02:19
поделиться

В perl:

s/quick(.*)lazy/slow${1}energetic/;

В vim:

s/quick\(.*\)lazy/slow\1energetic/;
2
ответ дан 28 November 2019 в 02:19
поделиться

Есть хороший способ сделать это в Ruby, используя gsub с блоком:

s = "The quick brown fox jumps over the lazy dog"
subs = {'quick' => 'slow', 'lazy' => 'industrious'}
s.gsub(/quick|lazy/) { |match| subs[match] }
# => "The slow brown fox jumps over the industrious dog"
-2
ответ дан 28 November 2019 в 02:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: