React Native中不使用lookbehind如何实现指定正则匹配需求
问题原因
React Native 部分运行时(低版本Hermes引擎、iOS 14.2以下内置JavaScriptCore)不支持正则后行断言(lookbehind)语法,会直接导致构建/运行报错,替换为全兼容的捕获组写法即可。
兼容正则实现
不需要使用零宽断言,将前缀规则纳入整体正则匹配,通过捕获组提取目标内容即可,正则写法如下:
/^5(?:\. | )([A-Z \d-]+)$/gm
正则规则说明
^5:匹配行起始位置的数字5(?:\. | ):非捕获组,匹配两种前缀格式:.(点+空格)或单个空格,对应要求的5.、5两种前缀([A-Z \d-]+):捕获组,匹配目标内容,规则和原逻辑一致:仅允许大写字母、空格、数字、短横线$:匹配行结束位置- 修饰符
g为全局匹配,m为多行模式,让^/$可以匹配每一行的首尾,而非整个字符串的首尾
代码使用示例
因为目标内容存放在第一个捕获组中,提取时取匹配结果的索引1即可:
const testContent = `5. GET ME 5 GET ME DONT GET ME`; const reg = /^5(?:\. | )([A-Z \d-]+)$/gm; // 写法1:exec循环提取 const res = []; let tempMatch; while ((tempMatch = reg.exec(testContent)) !== null) { res.push(tempMatch[1]); } // 输出结果:["GET ME", "GET ME"] // 写法2:matchAll 简化写法 const res2 = [...testContent.matchAll(reg)].map(item => item[1]); // 输出结果:["GET ME", "GET ME"]
如果你的待匹配字符串行首存在固定前导空格,只需要在正则的
^后加上\s*即可,调整为/^\s*5(?:\. | )([A-Z \d-]+)$/gm,就可以兼容行首带空格的场景,匹配结果和预期完全一致:前两行提取到GET ME,第三行因前缀不匹配不会被命中。
内容的提问来源于stack exchange,提问作者Joshua Augustinus
相关产品推荐
相关产品推荐

