gpt4 book ai didi

使用 TextWrangler 的正则表达式删除重复的行开头

转载 作者:行者123 更新时间:2023-12-03 07:47:58 25 4
gpt4 key购买 nike

尝试转身

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

进入

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

因此,各行已排序。如果连续行以相同的字符序列开头,直到/包括一些分隔符(这里是冒号(及其后面的空格)),则只应保留第一个实例 - 所有行的其余部分也应如此。 最多可能有大约十二(半)行以相同的字符序列开头。 输入内容大约有 4,500 行……

在 TextWrangler 中尝试过。

虽然搜索模式

^([[:alnum:]]+): (.+)\r((\1:) (.+)\r)*

匹配正确,没有替换

\1:\t\2\r\t\3\r

也不

\1:\t\2\r\t\4\r

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

搜索模式

^(.+): (.+)\r((?<=\1:) (.+)\r)*

由于后向查找长度不固定而被拒绝。 - 不确定,不过无论如何,它都会朝着正确的方向发展。

看着 How to merge lines that start with the same items in a text file我想知道是否存在一种优雅的(例如:一种搜索模式,一种替换,运行一次)解决方案。

另一方面,我可能无法提出在网上搜索的正确问题。如果您更了解,请指出我正确的方向。

保持其余行对齐当然是锦上添花......

感谢您的宝贵时间。

最佳答案

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

PCRE is not fully Perl-compatible when it comes to lookbehind. While Perl requires alternatives inside lookbehind to have the same length, PCRE allows alternatives of variable length.

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

(?<=(\w\w:)|(\w:)) (.*\n?)\1?\2?

并替换为 \t\3 。请参阅test at regex101 。捕获回溯内部对于不消耗/不跳过匹配非常重要。相同模式变量eg .NET :(?<=(\w+:)) (.*\n?)\1?

  • (?<=(\w\w:)|(\w:))前两个capture groups用于捕获前缀的内部lookbehind:两个或一个单词字符,后跟一个冒号。 \wshorthand对于 [A-Za-z0-9_]

  • (.*\n?)第三个捕获组用于前缀之间的内容。可选换行符来获取最后一个匹配项。

  • \1?\2?如果在下一行中,则可以选择替换相同的前缀。只能设置两者之一:\1异或\2 。此外,冒号后面的空格始终会匹配 - 无论前缀如何。

<小时/>

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

关于使用 TextWrangler 的正则表达式删除重复的行开头,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25298370/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com