如何让JavaScript正则表达式返回字符串所有内容作为匹配项
如何让JavaScript正则返回字符串所有内容(含普通文本和目标匹配片段)
你当前的正则仅匹配带*、_或[]的特殊片段,想要同时返回这些片段之间的普通文本,需要调整正则逻辑,让它同时匹配特殊模式和普通内容。
解决方案
修改正则,同时匹配你的目标特殊模式,以及这些模式之间(包括开头/结尾)的普通文本。关键是使用非贪婪匹配和正向预查来精准截取普通内容,避免过度匹配。
调整后的正则
/(?:\[\d+\]|\*.*?\*|_.*?_)|([\s\S]+?)(?=\[\d+\]|\*.*?\*|_.*?_|$)/gu
正则解析
(?:\[\d+\]|\*.*?\*|_.*?_):非捕获分组,匹配你定义的三种特殊格式(数字括号、星号包裹文本、下划线包裹文本),直接作为完整匹配项返回。|:逻辑或,匹配特殊模式或普通文本。([\s\S]+?):非贪婪匹配任意字符([\s\S]包含换行符),确保只截取到下一个特殊模式前的内容。(?=\[\d+\]|\*.*?\*|_.*?_|$):正向预查,标记普通文本的结束位置——下一个特殊模式或字符串末尾。
代码示例
const testStr = '*This* is a test.[15] I would like[16] To figure _out how_ to do this.[20]'; const regex = /(?:\[\d+\]|\*.*?\*|_.*?_)|([\s\S]+?)(?=\[\d+\]|\*.*?\*|_.*?_|$)/gu; const allMatches = Array.from(testStr.matchAll(regex), match => match[0]); console.log(allMatches);
输出结果
[ "*This*", " is a test.", "[15]", " I would like", "[16]", " To figure ", "_out how_", " to do this.", "[20]" ]
注意:原正则中的
.*是贪婪匹配,若字符串中有多个同类型特殊片段(比如两个*xxx*)会错误地从第一个*匹配到最后一个*,改为.*?非贪婪匹配即可避免这个问题。
内容的提问来源于stack exchange,提问作者Justin808
相关产品推荐
相关产品推荐

