【问题标题】:Regex to rename/modify duplicate lines正则表达式重命名/修改重复行
【发布时间】:2016-12-06 05:30:42
【问题描述】:

我正在寻找一个单一的 UNIX/Perl/PHP 风格的正则表达式来对文本字符串列表执行以下操作:

  • 搜索以“#”字符开始的第一行
  • 修改所有出现更多搜索字符串但没有开头的“#”的字符串,以便这些行也以“#”开头。此类行可能有尾随文本(但不一定有)。

这必须在一条路径中完成。

例如:

some line
# some string
some line
some line
some line
some string some other string
some line
some line
some string
some line
some line
some line
some string some trailing text
some line

Regex101

所以我正在寻找的是一个正则表达式,它将匹配# some string 行,然后在以some string 开头的其他行的开头添加#。将被匹配和修改的行是,

  • some string some other string -> # some string some other string
  • some string -> # some string
  • some string some trailing text -> # some string some trailing text

我曾考虑使用^(#?[^\r\n]+$)[\s\S]*(^\1[^\r\n]*$)+ 之类的方法来匹配所有此类事件,但我需要将其拆分以替换每个单独的事件...

谢谢。

【问题讨论】:

  • 到目前为止你尝试过什么正则表达式?
  • ^(#?[^\r\n]+$)([\s\S]*)(^\1[^\r\n]*$)+

标签: regex replace duplicates rename


【解决方案1】:

尝试将其编写为单个正则表达式听起来像是无法维护代码的秘诀。我会这样写:

my $prefix;
while (<>) {
  # If we find a line that starts with #, then set $prefix
  if (/^# (.*)/) {
    $prefix = $1;
  }

  # If $prefix is defined and we find a line that starts with $prefix,
  # then prepend '#'
  if (defined $prefix and /^$prefix/) {
    $_ = "$prefix $_";
  }

  print;
}

【讨论】:

  • 谢谢。但是,这不是针对代码的,而是作为文本编辑器宏的一个步骤,这就是为什么需要一次性运行它的原因。如果我可以使用循环,我会这样做。
  • 在提问时提及此类限制可能是个好主意。
  • 戴夫,真的,谢谢,但我要求的是正则表达式而不是代码。
  • 我明白这一点。但是每个正则表达式引擎都是不同的。为了得到有用的答案,您需要告诉我们正则表达式将如何执行。
  • 好的,我听到了。
【解决方案2】:

后面的变量会很好。
但大多数正则表达式引擎不支持这一点。只有固定的目光在后面。

但是,如果您可以反转该字符串列表。
那么你可能仍然可以对反转的文本使用积极的前瞻。并在替换后反转文本。

一个非常简单的例子。

我们从正文开始:

z
# a
a y
a
x

现在我们反转文本:

x
a
y a
a #
z

现在我们替换所有(全局,多行)
(\w+$)(?=[\s\S]+\1 ?#)
通过\0 #

我们得到:

x
a #
y a #
a #
z

现在反转结果:

z
# a
# a y
# a
x

【讨论】:

    【解决方案3】:

    查找:

    (?-s)(?:.*\R)*?\K.*(some string).*(?s)(\R.*)\1

    替换为:

    \1\2 some other string

    【讨论】:

      猜你喜欢
      • 2016-03-20
      • 1970-01-01
      • 2014-04-03
      • 1970-01-01
      • 2020-01-19
      • 1970-01-01
      • 1970-01-01
      • 2016-08-22
      • 2020-08-13
      相关资源
      最近更新 更多