如何将用户输入双引号替换为规范左右引号?解决代码空格限制问题
修复引号前后无空格时的替换失效问题
嘿,我瞅见你这段处理引号替换的代码遇到了小问题——只能搞定前后带空格的引号,像"test"这种紧挨着文字的完全没效果对吧?别担心,咱们调整下正则逻辑,就能覆盖所有场景的ASCII双引号替换:
修正后的完整代码
$('#myInput').on("keyup", function(e) { // 匹配行首或非右引号后的双引号,替换为左引号 this.value = this.value.replace(/(^|[^”])"/g, '$1“'); // 匹配行尾或非左引号前的双引号,替换为右引号 this.value = this.value.replace(/"([^“]|$)/g, '”$1'); });
为啥原来的代码不行?
原来的正则/ "/g和/" /g只匹配带有空格的引号,完全忽略了引号直接跟文字、数字或标点的情况,比如"hello"、world"、"123"这些场景都没覆盖到。
新正则的逻辑拆解
第一个正则
/(^|[^”])"/g:^匹配字符串开头的引号,比如"开头的内容[^”]匹配不是右引号的任意字符,确保不会把已经转换好的”再当成左引号处理- 替换时用
$1保留引号前面的内容(如果有的话),再加上规范左引号“
第二个正则
/"([^“]|$)/g:$匹配字符串结尾的引号,比如内容结尾"[^“]匹配不是左引号的任意字符,避免把已经转换好的“再当成右引号处理- 替换时先加规范右引号
”,再用$1保留引号后面的内容(如果有的话)
额外小优化
如果想避免在连续输入时反复触发替换(比如已经是中文引号了还被处理),上面的代码已经通过[^”]和[^“]避免了重复转换的问题,日常使用足够啦。
内容的提问来源于stack exchange,提问作者Takit Isy




