В Perl, как «перепрыгнуть» определенный текст и выполнить поиск и замену в оставшейся части? [Дубликат]
На этот вопрос уже есть ответ здесь:
Как выполнить поиск и замену в заданных диапазонах $ start- $ end? 4 ответаТекст имеет много вхожденийpattern
; выполняя поиск и замену регулярных выражений, я хочу перепрыгнуть через определенные сегменты текста и заменитьpattern
в оставшейся части. Пример, в коде:
#!/usr/bin/env perl
use strict;
use warnings;
#iterate the DATA filehandle
while (<DATA>) {
# This one replaces ALL occurrences of pattern.
s/old/new/gs;
# How do I skip the unwanted segments and do the replace?
#print all
print;
}
##inlined data filehandle for testing.
__DATA__
START xx old xx END --> within boundaries, should NOT replace
START xx old
xx old xx END --> within boundaries, should NOT replace
// xx old --> within comment, should NOT replace
xx // xx old --> within comment, should NOT replace
. old old xx --> following a point, should NOT replace
first one, just replace second one
xx .
old
old xx --> following a point, should NOT replace first
one, just replace second one.
xx old xx --> other scenarioes, should REPLACE
РЕДАКТИРОВАТЬ 16.2.22(обновлено 16.2.23) Критерии замены / отсутствия замены следующие: (1)START
а такжеEND
может быть на одной строке или занимать несколько строк, всеpattern
s в этом диапазоне НЕ должны заменяться;
(2).
а такжеpattern
могут иметь или не иметь пробелы, табуляции, новые строки между ними, первое вхождениеpattern
после.
следует заменить;
(3) комментарии всегда будут одной строкой, начинающейся с //; не учитывайте / * ... * / стиль комментариев на данный момент.
(4)//
может быть или не быть первым символом строки; так же и с.
.
Все, что находится между START_FLAG и END_FLAG или что-либо внутри комментария, должно игнорироваться; и, еслиpattern
следует за ".", это также следует игнорировать.pattern
s в оставшейся части текста должны быть заменены новыми. Я пытался использоватьs/START.*?END|\/\/.*?\n|.\s*\w+|\w+//g
вещи, но просто не может прийти к решению.
Это кажется немного запутанным для меня; любая помощь? Спасибо заранее :-)