RegEx使用TextWrangler删除重复的行开始

Abe*_*cee 14 regex textwrangler replace

试着转身

a: 1, 2, 3
a: a, b, v
b: 5, 6, 7
b: 10, 1543, 1345
b: e, fe, sdf
cd: asdf, asdfas dfasdfa,asdfasdfa,afdsfa sdf
e1: asdfas, dafasd, adsf, asdfasd
e1: 1, 3, 2
e1: 9, 8, 7, 6
Run Code Online (Sandbox Code Playgroud)

a: 1, 2, 3
   a, b, v
b: 5, 6, 7
   10, 1543, 1345
   e, fe, sdf
cd: asdf, asdfas dfasdfa,asdfasdfa,afdsfa sdf
e1: asdfas, dafasd, adsf, asdfasd
    1, 3, 2
    9, 8, 7, 6
Run Code Online (Sandbox Code Playgroud)

因此,线条已排序.如果连续行以相同的字符序列开始,直到/包括某些分隔符(此处为冒号(及其后面的空格)),则只应保留第一个实例 - 应该是所有行的其余部分.从相同的字符序列开始,最多可能有十几(一半)行.输入大约有4,500行......

在TextWrangler中尝试过.

同时搜索模式

^([[:alnum:]]+): (.+)\r((\1:) (.+)\r)*
Run Code Online (Sandbox Code Playgroud)

匹配正确,没有替换

\1:\t\2\r\t\3\r
Run Code Online (Sandbox Code Playgroud)

也不

\1:\t\2\r\t\4\r
Run Code Online (Sandbox Code Playgroud)

让我接近我正在寻找的东西.

搜索模式

^(.+): (.+)\r((?<=\1:) (.+)\r)*
Run Code Online (Sandbox Code Playgroud)

由于不是固定长度的后卫而被拒绝. - 不确定,无论如何,它正朝着正确的方向前进.

看看 如何合并以文本文件中的相同项目开头的行 我想知道,是否存在优雅(例如:一个搜索模式,一个替换,一次运行)解决方案.

另一方面,我可能无法提出正确的搜索网络问题.如果你知道的更好,请指出我正确的方向.

保持其余行对齐当然是糖的问题......

感谢您的时间.

Jon*_*y 5 6

作为可变长度lookbehind的解决方法:PCRE允许可变长度的替代方案

在外观方面,PCRE并不完全兼容Perl.虽然Perl要求lookbehind内部的替代品具有相同的长度,但PCRE允许可变长度的替代品.

需要为每个最大前缀长度字符添加管道的想法:

(?<=(\w\w:)|(\w:)) (.*\n?)\1?\2?
Run Code Online (Sandbox Code Playgroud)

并替换为\t\3.请参阅regex101上的测试.捕捉后视内部对于不消耗/不跳过匹配很重要.相同的模式变量,例如.NET:(?<=(\w+:)) (.*\n?)\1?

  • (?<=(\w\w:)|(\w:))lookbehind中的前两个捕获组用于捕获前缀:两个或一个单词字符后跟冒号.\w是一个简写[A-Za-z0-9_]

  • (.*\n?)第三个捕获组,用于前缀之间的内容.获取最后一场比赛的可选换行符.

  • \1?\2?如果在以下行中,将可选地替换相同的前缀.只能设置其中一个:\1xor \2.冒号后的空格也总是匹配 - 无论前缀如何.


摘要:每个前缀后的空格将转换为制表符.仅当匹配当前时,后续行的前缀.
       要匹配和替换多个空格和制表符:(?<=(\ w\w:)|(\ w:))[\ t] +(.*\n?)\ 1?\ 2?