【发布时间】:2016-02-22 04:03:07
【问题描述】:
文本中有多次出现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可以在一行,也可以跨越多行,这个范围内的patterns都不能替换;
(2).和pattern之间可能有也可能没有空格、制表符、换行符,.之后第一次出现的pattern应该被替换;
(3) cmets 总是以 //; 开头的一行。暂不考虑 /* ... */ 的 cmets 样式。
(4) // 可能是也可能不是一行的第一个字符; . 也是如此。
应该忽略 START_FLAG 和 END_FLAG 之间的任何内容,或评论中的任何内容;并且,如果pattern 跟在“.”之后,它也应该被忽略。 patterns 在文本的其余部分应替换为新内容。我尝试使用s/START.*?END|\/\/.*?\n|.\s*\w+|\w+//g 的东西,但无法找到解决方案。
这对我来说似乎有点令人费解;有什么帮助吗?提前谢谢:-)
【问题讨论】:
-
感谢帮助回答这个问题的人的建议,我意识到我的问题有很多模棱两可的地方,无法完整涵盖我打算涵盖的所有案例。我只是看看我是否可以用修改后的方式发表一个新帖子来表达我的问题。
-
您在代码中的注释和 EDIT 有冲突。在您在 START 和 END 之间说的代码中,在 cmets 中不应替换,并且在您的 EDIT 中,您说 START END 范围内的所有模式和 .应该更换。
-
@texasbruce 感谢您仔细检查帖子,亲爱的朋友。我已经更新了帖子以保持一致性。实际上这篇文章不是一个“好”的问题;我已经在click_this_link 发布了一个新问题,并且已经解决。再次感谢:-)
标签: regex perl replace conditional skip