You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

JavaScript正则表达式替换无法保留%等指定特殊字符问题

问题描述

用户编写了一段限制输入框字符的代码:

$('.pure').on('keyup', function (e) {            
    e.preventDefault();
    var str = $(this).val();
    $(this).val(str.replace(/[^a-z0-9\s,.-^%]+$/ig, ''));
});

期望仅允许输入以下字符:

A-Z、a-z、0-9、,、.、-、% 和空格

测试输入字符串:

You have selected the following date - %date%.

实际问题:%字符会被意外移除,而$&等其他特殊字符被移除符合预期,需要保留%字符。

解决办法

你这正则的问题出在字符集里的-位置——-在字符集里如果夹在两个字符中间,会被当成范围运算符。你写的.-^会被解析成从.(ASCII码46)到^(ASCII码94)的所有字符,而%的ASCII是37,不在这个范围里,所以会被当成非法字符删掉。

改法很简单,把-挪到字符集的开头或者末尾就行,这样它就不会被当成范围运算符了:

$('.pure').on('keyup', function (e) {            
    e.preventDefault();
    var str = $(this).val();
    $(this).val(str.replace(/[^a-z0-9\s,.%^-]+$/ig, ''));
});

或者直接给-加转义符\-,也能解决问题:

$(this).val(str.replace(/[^a-z0-9\s,.\-^%]+$/ig, ''));

另外补充一点:你当前的正则只删除字符串末尾的连续非法字符,如果想让输入框里所有位置都只能出现允许的字符,把正则末尾的$去掉即可:

$(this).val(str.replace(/[^a-z0-9\s,.%^-]+/ig, ''));

内容的提问来源于stack exchange,提问作者Sickaaron

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 14:27:22