Я использую Perl для создания прототипов.perl Regex заменить для определенной длины строки
Мне нужно выражение, чтобы заменить e
на [ee]
, если строка ровно 2 символа и заканчивается буквой «e».
le -> l [ee]
me -> m [ee]
elle -> elle : no change
Я не могу проверить длину строки, мне нужно одно выражение, чтобы выполнить всю работу.
Я пробовал:
`s/(?=^.{0,2}\z).*e\z%/[ee]/g` but this is replacing the whole string
`s/^[c|d|j|l|m|n|s|t]e$/[ee]/g` same result (I listed the possible letters that could precede my "e")
`^(?<=[c|d|j|l|m|n|s|t])e$/[ee]/g` but I have no match, not sure I can use^on a positive look behind
EDIT Ребята вы изумительны, часы поиска в Интернете и здесь я получаю ответы минут после того, как я отправил.
Я перепробовал все свои решения, и они работают отлично непосредственно в моем сценарии, то это:
my $test2="le";
$test2=~ s/^(\S)e$/\1\[ee\]/g;
print "test2:".$test2."\n";
-> test2:l[ee]
Но я погрузкой этих регулярных выражений из текстового файла (с помощью Perl для прото, идея состоит в том, чтобы использовать его с любым языком, реализующего регулярное выражение):
в текстовом файле я хранить, например (я использовал% разделить линию между спичкой и заменить):
^(\S)e$% \1\[ee\]
и Затем я разобрать и применить все регулярное выражение так:
my $test="le";
while (my $row = <$fh>) {
chomp $row;
if($row =~ /%/){
my @reg = split /%/, $row;
#if no replacement, put empty string
if($#reg == 0){
push(@reg,"");
}
print "reg found, reg:".$reg[0].", replace:".$reg[1]."\n";
push @regs, [ @reg ];
}
}
print "orgine:".$test."\n";
for my $i (0 .. $#regs){
my $p=$regs[$i][0];
my $r=$regs[$i][1];
$test=~ s/$p/$r/g;
}
print "final:".$test."\n";
Этот метод хорошо работает с моим другом регулярное выражение, но еще не тогда, когда у меня есть $ 1 или \ 1 в замене ... вот что я получить :
final:\1\ee\
PS: вы ответили на первоначальный вопрос, следует ли открыть другое сообщение?
Что такое допустимый первый символ, что-нибудь ? – sln
Все утверждения действуют в текущем положении. Они смотрят вперед или назад. Поскольку '^' соответствует, текущая позиция равна 0, BOS, перед этим ничего нет. – sln
'Этот метод хорошо работает с моим другим регулярным выражением, но еще нет, когда у меня есть $ 1 или \ 1 в replace'. Регулярное выражение просто заменяет то, что находится в' $ r'. Я думаю, вам нужно сделать еще один шаг, используя форму оценки 's /// e' (см. _perlre_ docs) для замены. Регулярное выражение будет выглядеть как '$ test = ~ s/$ p/$ r/e;'. – sln