提问人:Old Geezer 提问时间:8/14/2023 最后编辑:Old Geezer 更新时间:8/14/2023 访问量:40
匹配后,在重新开始搜索之前“备份”一下
After matching, "back up" a bit before restarting search
问:
我正在尝试对以下内容执行全局搜索:
\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
有没有一个正则表达式可以满足我的需求?
我可以做第一遍来修改源,在每个数字之前添加一个特殊的分隔符,但有没有更优雅的解决方案?
答:
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
评论
(?s)(\n\d{1,3}.*?)(?=\n\d|$)
(?s)\n\d.*?(?=\n\d|$)