В тексте много раз встречается 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
EDIT 16.2.22 (обновлено 16.2.23) Критерии для замены/без замены следующие: (1) START
и END
могут находиться в одной строке или охватывать несколько строк, все pattern
в этом диапазоне должны НЕ подлежит замене;
(2) .
и pattern
могут иметь или не иметь пробелов, табуляции, новой строки между ними, первое вхождение pattern
после .
должно быть заменено;
(3) комментарии всегда будут состоять из одной строки, начинающейся с //; пока не рассматривайте /* ... */ стиль комментариев.
(4) //
может быть или не быть первым символом строки; так и с .
.
Все, что находится между START_FLAG и END_FLAG или что-либо внутри комментария, следует игнорировать; и, если pattern
следует за ".", его также следует игнорировать. pattern
s в оставшейся части текста заменить на новый материал. Я пытался использовать s/START.*?END|\/\/.*?\n|.\s*\w+|\w+//g
, но не нашел решения.
Это кажется мне немного запутанным; любая помощь? Спасибо заранее :-)