我在新行上有文字,如下:
tom
tim
john
will
tod
hello
test
ttt
three
我想删除每一个第三行,所以使用上面的示例我要删除:john,hello,three
我知道这需要一些正则表达式,但我不是最好的!
我尝试了什么:
Search: ([^\n]*\n?){3} //3 in my head to remove every third
Replace: $1
我试过的其他人只是尝试\n\r
等等。再次,不是最好的正则表达式。我认为上述尝试有点接近。
答案 0 :(得分:6)
gedit ubuntu
搜索:(.*?)\n(.*?)\n(.*)\n
替换为:\1\n\2\n
答案 1 :(得分:3)
这将删除每个可能包含多个单词的第三行。
(?:[^\r\n]+\R){2}\K[^\r\n]+(?:\R|\z)
LEAVE EMPTY
<强>解释强>
(?: # start non capture group
[^\r\n]+ # 1 or more non linebreak
\R # any kind of linebreak (i.e. \r, \n, \r\n)
){2} # end group, appears twice (i.e. 2 lines)
\K # forget all we have seen until this position
[^\r\n]+ # 1 or more non linebreak
(?: # start non capture group
\R # any kind of linebreak (i.e. \r, \n, \r\n)
| # OR
\z # end of file
) #end group
给定示例的结果:
tom
tim
will
tod
test
ttt
截屏:
答案 2 :(得分:1)
由于OP说Sahil的答案&#34;工作就像一个魅力&#34;我假设notepad ++中的文本以换行符结尾。否则,Sahil和Toto的答案将无法与最终的单词匹配。
Sahil的模式:如果文字以(.*?)\n(.*?)\n(.*)\n
结尾,\n
需要 79步 *;否则 112步并失败
他的替换表达式不必要地使用了两个捕获组引用。
Toto的模式:如果文字以((?:[^\r\n]+\R){2})[^\r\n]+\R
结尾,\n
需要 39步 *;否则 173步并失败。
他的替换表达式使用一个捕获组引用。
我建议的模式只需 25步,并且不使用任何捕获组。 您的文字是一系列非白色字符,后跟白色字符,因此以下是提供最高速度的最短,最准确的图案:
\S+\s+\S+\s+\K\S+\s*
此模式应与空替换配对。
\S
表示&#34;非空白字符&#34;
\s
表示&#34;空白字符&#34;
+
表示前一个匹配中的一个或多个
*
表示前一个匹配的零个或多个
\K
表示保持匹配从此处开始
最终*
上的\s
允许最后3行文本结束而没有尾随换行符。在对大量文本进行此类操作时,务必确保替换在整个文本上正常工作并且不会留下不需要的子字符串。
虽然我确定你早就忘记了这个正则表达式的任务,但重要的是未来的读者可以从学习获得理想结果的最佳方法中受益。
答案 3 :(得分:0)
另一种方法,您可以使用插件ConyEdit来执行此操作。使用命令行var arr = [{ item: { id: 1, name: "Abc" }, amount: 1 }, { item: { id: 1, name: "Abc" }, amount: 2 }, { item: { id: 2, name: "Abc" }, amount: 2 },{ item: { id: 1, name: "Abc" }, amount: 2 }];
var res = {};
arr.map((e) => {
if(!res[e.item.id]) res[e.item.id] = Object.assign({},e); // clone, credits to: @amrender singh
else res[e.item.id].amount += e.amount;
});
console.log(Object.values(res));
删除每个组的第三行,每个组3行。