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
相关产品推荐
相关产品推荐

