如何编写正则实现连字符(-)按场景替换为minus或空字符串
问题分析与修正方案
原有正则的问题
- 数字匹配规则错误:你在
-后额外添加了\w或者全量特殊字符匹配逻辑,会多吞掉-后的1个字符,比如9-{{response}}会匹配到9-{三个字符,替换时会把{也一同删掉,这是你只匹配到片段的核心原因。 - 空白匹配范围不足:
[ ]{0,1}只能匹配最多1个半角空格,无法适配-两侧有多个空格的场景,应该用\s*匹配任意数量的空白字符。 - 字母间连字符的正则逻辑错误:
/([A-Za-z])-([A-Za-z]){0}\w/gi中的{0}代表前面的分组出现0次,完全多余,后续的\w会多匹配1个字符,替换后会丢失原有的字母。
修正后的实现代码
第一步:处理一侧为数字的连字符替换
利用环视语法只匹配符合规则的-(含前后空白),不会吞掉前后的原有字符,可覆盖你列出的所有数字相关场景:
// 把任意一侧为数字的连字符替换为minus readOutText = readOutText.replace(/(?<=\d)\s*-\s*|\s*-\s*(?=\d)/g, ' minus ');
第二步:处理两侧都是英文字母的连字符替换
如果你需要把这类连字符替换为空字符串,用以下代码:
readOutText = readOutText.replace(/([a-zA-Z])-([a-zA-Z])/g, '$1$2');
如果你需要按你原有注释的逻辑替换为空格,修改为:
readOutText = readOutText.replace(/([a-zA-Z])-([a-zA-Z])/g, '$1 $2');
测试效果
针对你给出的测试用例,替换后结果如下:
9 - {{response}}→9 minus {{response}}9-{{response}}→9 minus {{response}}{{response}}-9→{{response}} minus 9{{response}} - 9→{{response}} minus 97346788-literallyanything→7346788 minus literallyanythingliterallyanything-347583475→literallyanything minus 347583475akhila-hegde→akhilahegde(替换为空的情况)/akhila hegde(替换为空格的情况)
内容的提问来源于stack exchange,提问作者Coder
相关产品推荐
相关产品推荐

