如何用Notepad++正则表达式标记分隔符前最后一个逗号分隔值
问题:用Notepad++正则为分隔符前最后一个带逗号数字行添加书签
原始文本
Drtyjtyjnt 11,825,222 Ftyryer 8,823,623 Strtrtuperd 8,542,448 Ts 7,153,156 Supd 7,122,304 Su.3 6,920,743 Supld dddd tgtgtg Sd April 1991 ///////////////////////// Freeeer 7,537,583 Dufdgnt 4,381,322 SioBup 3,010,937 S 2,238,608 Du SuperM Sup August 1989 ///////////////////////// D 12,184,781 S 9,023,965 Fog 8,913,781 Supe 7,441,191 May 1991 /////////////////////////
需求
给每个/////////////////////////分隔符之前的最后一个带逗号的数字行添加书签,目标行如下:
6,920,743 2,238,608 7,441,191
原正则失效原因分析
第一个正则:(?-s)(\d{1,3}(?:,\d{3})+)(?=(?:(?!\R/////////////////////////).)*\R/////////////////////////)
(?-s)关闭了单行模式,.无法匹配换行符,导致(?:(?!\R/////////////////////////).)*只能匹配当前行内的字符,无法跨行匹配到后续的分隔符,自然无法找到符合条件的目标行。
第二个正则:(?s)(\d{1,3}(?:,\d{3})+)(?=(?:\R(?!/////////////////////////).)*\R/////////////////////////)
(?s)开启单行模式后,.能匹配换行,但表达式仅限制后续行不是分隔符,没有限制后续行不能出现其他带逗号的数字行。这会导致所有带逗号的数字行(只要后面有分隔符)都被匹配,而不是最后一个符合条件的行。
可行解决方案
正则表达式(匹配整行)
^(\d{1,3}(?:,\d{3})+)$(?=(?:\R(?!^\d{1,3}(?:,\d{3})+$|^/////////////////////////$).)*\R^/////////////////////////$)
逻辑说明
^(\d{1,3}(?:,\d{3})+)$:精准匹配整行的带逗号数字格式(如6,920,743)- 正向预查
(?=...):确保当前行之后直到分隔符的所有行里,不再出现其他带逗号的数字行,只允许非目标行和分隔符存在,以此定位到每个分隔符前的最后一个目标行。
Notepad++操作步骤
- 打开目标文本,按下
Ctrl+F打开查找对话框 - 切换到「标记」标签页
- 勾选「正则表达式」选项,不要勾选「.匹配换行」
- 输入上述正则表达式
- 点击「标记全部」,即可给所有目标行添加书签
内容的提问来源于stack exchange,提问作者Pubg Mobile
相关产品推荐
相关产品推荐

