我有这个正则表达式匹配有效名称:/^['"\s\-.*0-9\u00BF-\u1FFF\u2C00-\uD7FF\w]+$/.test(name)
我无法弄清楚如何将此匹配样式正则表达式转换为使用replace
过滤掉无效字符的正则表达式。
理想情况下,我希望能够在name
中使用无效名称,通过replace
运行它来替换任何无效字符,然后让原始测试返回true,无论如何(如无效字符将被过滤掉。)
答案 0 :(得分:1)
通过在前面添加^
来使用否定的字符类:
name.replace(/[^'"\s\-.*0-9\u00BF-\u1FFF\u2C00-\uD7FF\w]/g, "")
示例:
var name = "'41%!\u2000abc";
var sanitized = name.replace(/[^'"\s\-.*0-9\u00BF-\u1FFF\u2C00-\uD7FF\w]/g, "");
console.log(/^['"\s\-.*0-9\u00BF-\u1FFF\u2C00-\uD7FF\w]+$/.test(name)); // false
console.log(/^['"\s\-.*0-9\u00BF-\u1FFF\u2C00-\uD7FF\w]+$/.test(sanitized)); // true
答案 1 :(得分:1)
/^['"\s\-.*0-9\u00BF-\u1FFF\u2C00-\uD7FF\w]+$/
最后的+
告诉您匹配括号内类型的至少1个或多个字符。开头的^
与最后的$
结合使用,表示从开始到结束匹配整个输入。因此,给定正则表达式匹配仅由该集合的字符组成的字符串。
你想要的是这个:
/[^'"\s\-.*0-9\u00BF-\u1FFF\u2C00-\uD7FF\w]/g
[^]
表示不匹配括号内的任何内容,与[]
相反。