Regex 用于重命名/修改重复行的正则表达式

Regex 用于重命名/修改重复行的正则表达式,regex,replace,duplicates,rename,Regex,Replace,Duplicates,Rename,我正在寻找一个UNIX/Perl/PHP风格的正则表达式,以使用文本字符串列表执行以下操作: 搜索以“#”字符开头的第一行 修改所有字符串,使其包含更多搜索字符串,但开头不带“#”,以便行也以“#”开头。这些行可能有尾随文本(但不一定有) 这必须在一条道路上完成 例如: 因此,我要寻找的是一个正则表达式,它将匹配行#some string,然后在以some string开头的其他行的开头添加#。要匹配和修改的行是 some string some other string->#some

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

  • 搜索以“#”字符开头的第一行
  • 修改所有字符串,使其包含更多搜索字符串,但开头不带“#”,以便行也以“#”开头。这些行可能有尾随文本(但不一定有)
这必须在一条道路上完成

例如:

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

  • some string some other string
    ->
    #some string some other string
  • some string
    ->
    #some string
  • 一些字符串一些尾随文本
    ->
    #一些字符串一些尾随文本
我想做一些类似于
^(#?[^\r\n]+$)[\s\s]*(^\1[^\r\n]*$)+
的事情来匹配所有这些事件,但我需要拆分它来替换每个单独的事件


谢谢。

试图将其作为单个正则表达式编写,这听起来像是一个无法维护代码的配方。我会这样写:

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;
}
my$prefix;
而(){
#如果找到以#开头的行,则设置$prefix
如果(/^#(.*)/){
$prefix=$1;
}
#如果定义了$prefix,我们发现一行以$prefix开头,
#然后在“#”前面加上前缀
if(定义为$prefix和/^$prefix/){
$\=“$prefix$\”;
}
印刷品;
}

对于这一点,后面的变量查找将非常有用。
但大多数正则表达式引擎不支持这一点。只有固定的后面看

但是,如果您可以反转该字符串列表。
然后,您可能仍然可以对反向文本使用正向前瞻。并在替换后将文本反转回原处

一个非常简单的例子

我们从文本开始:

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
查找:

(?-s)(?:.*\R)*?\K.*(一些字符串)。*(?-s)(\R.*)\1

替换为:


\1\2一些其他字符串

到目前为止您尝试了什么正则表达式?
^(#?[^\r\n]+$)([\s\s]*)(^\1[^\r\n]*$)+
谢谢。但是,这并不是针对代码,而是作为文本编辑器宏的一个步骤,这就是为什么需要运行一次。如果我可以使用循环,我会这样做。在问你的问题时提到这样的限制可能是个好主意。Dave,真的,谢谢,但我要求的是regexp而不是代码。我理解这一点。但每个正则表达式引擎都是不同的。为了得到一个有用的答案,你需要告诉我们正则表达式将如何执行。好的,我听到了。
z
# a
# a y
# a
x