使用JavaScript正则替换引号为瑞士格式并解决误替换问题
解决瑞士格式引号替换的正则方案
要解决单引号缩写(比如that’s)被误替换的问题,关键是区分真正的引用引号和缩写中的撇号,可以通过正则的环视断言精准定位引用引号,同时一步完成所有替换:
最终实现代码
const inputText = `this "example": this «example» this “example”: this «example» this ‘example’: this ‹example› that’s a test sentence ‘don’t forget this case’`; const convertedText = inputText.replace( /(?<!\w)(["“”„])|(?<!\w)([‘’])|(["“”„])(?!\w)|([‘’])(?!\w)/g, (match, doubleLeft, singleLeft, doubleRight, singleRight) => { if (doubleLeft) return '«'; if (singleLeft) return '‹'; if (doubleRight) return '»'; if (singleRight) return '›'; return match; } );
方案说明
- 环视断言精准定位:
(?<!\w):反向否定环视,确保引号前面不是单词字符(排除缩写中间的撇号,比如that’s里的’前面是t,属于单词字符,不会被匹配)(?!\w):正向否定环视,确保引号后面不是单词字符(排除缩写中间的撇号,比如that’s里的’后面是s,属于单词字符,不会被匹配)
- 分组区分引号类型:
- 四个捕获组分别对应:左双引号、左单引号、右双引号、右单引号
- 替换函数根据捕获到的引号类型,返回对应的瑞士格式引号(
«/»对应双引号,‹/›对应单引号)
- 一步完成替换:通过一个正则匹配所有需要替换的场景,无需多次调用
replace
测试效果
- 原句
that’s→ 处理后仍为that’s(缩写撇号保留) - 原句
‘don’t do that’→ 处理后为‹don’t do that›(仅首尾引用引号被替换,中间缩写撇号保留) - 各类双引号(
"、“、”、„)均被替换为«...»
内容的提问来源于stack exchange,提问作者user20479148
相关产品推荐
相关产品推荐

