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