匹配后,在重新开始搜索之前“备份”一下

After matching, "back up" a bit before restarting search

提问人:Old Geezer 提问时间:8/14/2023 最后编辑:Old Geezer 更新时间:8/14/2023 访问量:40

问:

我正在尝试对以下内容执行全局搜索:

\n123 ABC\n多行 \n234 XYZ \N567 PQR \n422 ABCDEF \n999 EOF

我的目的是从上面返回:

123 abc
multi-lines

234 xyz

567 pqr

422 abcdef

我的正则表达式是“(?s)\n(\d{1,3}.*?)\d”。但是,用作结束分隔符的数字在匹配中被“消耗”,并且不用作下一个匹配项的开始分隔符。结果,我只得到结果的备用组:

123 abc
multi-lines

567 pqr

有没有一个正则表达式可以满足我的需求?

我可以做第一遍来修改源,在每个数字之前添加一个特殊的分隔符,但有没有更优雅的解决方案?

C# .NET 正则表达式

评论

0赞 Tim Biegeleisen 8/14/2023
你在这里使用编程语言吗?
0赞 Old Geezer 8/14/2023
PowerShell 中的 C#,但如果“更好”,可以切换到 Node。我正在拼凑一个脚本来处理一些原始数据。
1赞 The fourth bird 8/14/2023
喜欢这个? regex101.com/r/mLMzZP/1或者像这样,用整个比赛和换行符替换 regex101.com/r/v5wKhb/1(?s)(\n\d{1,3}.*?)(?=\n\d|$)(?s)\n\d.*?(?=\n\d|$)
0赞 Old Geezer 8/14/2023
👍🏻👍🏻👍🏻 @Thefourthbird 展望未来。

答:

1赞 The fourth bird 8/14/2023 #1

如果要将开头限制为 1 到 3 位数字,则必须在其后使用边界,否则可以仅以 match 开头。

然后,您可以断言换行符后跟数字或字符串的末尾。

如果替换,请使用完整匹配,后跟换行符。

请注意,如果要在 C# 中匹配数字 0-9,则可以使用代替 which 将匹配任何数字。[0-9]\d

(?s)\r?\n\d{1,3}\b.*?(?=\r?\n\d|$)

正则表达式演示

或者在仅匹配的 Javascript 中,匹配任何字符,包括换行符:[^]*?

\n\d{1,3}\b[^]*?(?=\n\d|$)

正则表达式演示

const regex = /\n\d{1,3}\b[^]*?(?=\n\d|$)/g;
const str = `
123 abc
multi-lines 
234 xyz 
567 pqr 
422 abcdef 
999`;
const result = str.replace(regex, `$&\n`);
console.log(result);

评论

1赞 Old Geezer 8/14/2023
谢谢。我的输入实际上更复杂,我为了问题的目的而减少了它。我需要的功能是,当我尝试各种 Google 查询时没有出现。lookahead