JS正则如何匹配:::后内容到三个下划线或文本输入末尾?
问题原因
你当前使用的*属于贪婪匹配符,会尽可能匹配最长的有效内容,所以在存在___的场景下会一直匹配到整个文本末尾的___位置,导致___之后的内容也被纳入第一个分组的匹配结果中。
修正后的正则
const thing = /[^:]:::([\s\S]*?)(?:_{3}|$)/gm
修改说明
- 将
[\s\S]*替换为[\s\S]*?,新增的?将贪婪匹配切换为非贪婪匹配,会尽可能匹配最短的内容,一旦扫描到___就立刻终止匹配,不会继续向后读取内容。 - 将原有的第二个分组改为非捕获分组
(?:_{3}|$),不会占用分组序号、也不会生成多余的匹配结果,同时保留了避免无限循环的作用。
效果验证
- 存在
___的场景:输入xxx:::需要匹配的内容___不需要的内容,第一个分组的匹配结果为需要匹配的内容,符合预期。 - 无
___的场景:会自动匹配到文本末尾,和原有逻辑一致。
内容的提问来源于stack exchange,提问作者Raven
相关产品推荐
相关产品推荐

