【问题标题】:In Perl, how to "jump over" certain text and do search-and-replace in the remaining part? [duplicate]在 Perl 中,如何“跳过”某些文本并在剩余部分进行搜索和替换? [复制]
【发布时间】: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)STARTEND可以在一行,也可以跨越多行,这个范围内的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


【解决方案1】:

使用普通的 if 语句就可以了:

while (<DATA>) {
  next if (m/^START/ && m/END$/ ) ||  m/^\/\// || m/^\./;
  s/old/new/gs;
  print;
}

注意 以上是OP编辑16.2.22之前的答案。

【讨论】:

  • 这个好像没解决问题哥们~
  • @katyusza 似乎没有?需要详细说明吗?
  • @texasbruce 从 OP 中挤出更多信息后,很快就清楚问题并不像看起来那么简单,正确的解决方案需要一个成熟的解析器。因为我不想为了回答一个问题而做这么多的工作,所以我删除了我简单的答案。我建议你也这样做。
  • @MattJacob 你是对的。他更新了这个问题。这是更新前的答案。但不会删除它。
  • 小伙伴们,这个问题在一个新帖子中得到了解决,链接是:stackoverflow.com/questions/35547683/…再次感谢;-)
猜你喜欢
  • 1970-01-01
  • 2021-03-04
  • 2017-01-05
  • 1970-01-01
  • 1970-01-01
  • 2014-02-21
  • 1970-01-01
  • 2017-02-03
  • 2010-10-30
相关资源
最近更新 更多