过滤此RegEx中的字符

时间:2014-07-31 01:34:45

标签: javascript regex

我有这个正则表达式匹配有效名称:/^['"\s\-.*0-9\u00BF-\u1FFF\u2C00-\uD7FF\w]+$/.test(name)

我无法弄清楚如何将此匹配样式正则表达式转换为使用replace过滤掉无效字符的正则表达式。

理想情况下,我希望能够在name中使用无效名称,通过replace运行它来替换任何无效字符,然后让原始测试返回true,无论如何(如无效字符将被过滤掉。)

2 个答案:

答案 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

[^]表示不匹配括号内的任何内容,与[]相反。