据我所知,我的RegEx是正确的,替换方法应该是这样做的。查看答案here和here,似乎我使用相同或非常相似的RegEx模式,并且它们是可接受的答案。
所以我想也许我对.replace方法做错了什么?
理想情况下,RegEx应该匹配字符类中包含的任何 not ,这意味着任何不是:az,0-9,' - ',' 。'和' _'。我读到没有必要在角色类中逃避特殊字符(除了' [',']'和' - ')所以我有只是逃脱了连字符。
非常感谢任何帮助。澄清;传递以下函数这个字符串:
'_;<!--Invalid--!"s"' null'
应该返回
____--invalid--____null
。
function nameSafe(name) {
var rgxIllegalChars = /^[^a-z0-9\-._]+$/;
name = name.toLowerCase();
return name.replace(rgxIllegalChars, '_');
}
编辑:已解决,请参阅已接受的答案以获取相关信息。完成功能:
function nameSafe(name) {
var rgxIllegalChars = /[^a-z0-9\-._]+/gi;
return name.replace(rgxIllegalChars, '_');
}
我在我的函数中添加了一些调试输出以尝试捕获之前和之后,并且有点愚蠢地忘记了.replace实际上并没有替换原始字符串。所以我这样做:
console.log(name);
name.replace(rgxIllegalChars, '_');
console.log(name);
return name;
道歉 - 如果您遇到麻烦,请不要忘记检查您的绝对基础知识(就像我一样) - 您使用的方法是返回新对象还是替换现有对象?
答案 0 :(得分:2)
您只需要移除锚点:
function nameSafe(name) {
var rgxIllegalChars = /[^a-z0-9\-._]+/;
name = name.toLowerCase();
return name.replace(rgxIllegalChars, '_');
}
编辑:
var name = "'_;<!--Invalid--!\"s\"' null'";
var rgxIllegalChars = /[^a-z0-9\-._]+/g;
name = name.toLowerCase();
alert(name.replace(rgxIllegalChars, '_'));
&#13;
请注意此行var rgxIllegalChars = /[^a-z0-9\-._]+/g;
答案 1 :(得分:2)
在正则表达式^
中表示assert position at start of the string
,$
表示assert position at end of the string
一旦删除这两项,它就会为您提供预期结果。
我已经为你https://regex101.com/r/xF7vA8/3在Regex101.com上创建了一个示例,点击Substitution按钮查看结果。