如何修改JS正则仅排除前后被相同特定字符串包裹的匹配项
正则修改方案
问题根源
你之前使用的(?<!e)n(?!e)逻辑是要求匹配项前后同时都不能出现指定字符串,只要单侧出现就会被排除,和你「仅排除前后同时被指定字符串包裹」的需求不符。
核心逻辑
你需要的排除规则是「匹配项前是指定字符串 且 匹配项后是指定字符串」,等价于保留所有满足「匹配项前不是指定字符串 或 匹配项后不是指定字符串」的结果。
简化案例实现
针对匹配不被e前后同时包裹的n的场景,正则写法如下:/(?<!e)n|n(?!e)/
效果验证:
- 不匹配
alkene中前后都是e的n - 正常匹配
pen中仅前面有e的n - 正常匹配
nest中仅后面有e的n - 正常匹配
bank中前后都没有e的n
实际场景修改方案
你需要匹配的核心片段是(ɣʷ|h₂|r₂|r₃|w|j)(?:e|o|ø|ɑ|i|ɚ|y|u|a),仅排除该片段前后同时紧邻¸ª的场景,修改后的正则如下:
/(?:(?<!¸ª)(ɣʷ|h₂|r₂|r₃|w|j)(?:e|o|ø|ɑ|i|ɚ|y|u|a)|(ɣʷ|h₂|r₂|r₃|w|j)(?:e|o|ø|ɑ|i|ɚ|y|u|a)(?!¸ª))/
如果觉得重复写核心匹配片段冗余,可通过字符串拼接生成正则:
// 核心匹配规则 const coreRule = '(ɣʷ|h₂|r₂|r₃|w|j)(?:e|o|ø|ɑ|i|ɚ|y|u|a)'; // 生成最终正则 const targetReg = new RegExp(`(?:(?<!¸ª)${coreRule}|${coreRule}(?!¸ª))`);
该正则可正常匹配你给出的样例t͡ʃe:h₁dɣʷo¸ªh₂¸ª中的ɣʷo片段。
内容的提问来源于stack exchange,提问作者Arcaeca
相关产品推荐
相关产品推荐

