【问题标题】:Filter characters in this RegEx过滤此 RegEx 中的字符
【发布时间】:2026-02-24 01:15:01
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么要运行替换,只需将您的正则表达式严格限制为您想要允许的字符..
  • 基于@hwnd 的评论,您的有效字符是什么?或者,如果这更容易,你的无效字符是什么?
  • 使用两个正则表达式,一个用于查找部分正确的名称,一个用于修复名称。回调确实是您所需要的。如果 JS 不能做到这一点,你必须坐在一个循环中并自己重建字符串。哦,等等,这不是字符串...

标签: javascript regex


【解决方案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

【讨论】:

    【解决方案2】:
    /^['"\s\-.*0-9\u00BF-\u1FFF\u2C00-\uD7FF\w]+$/
    

    末尾的+ 告诉您匹配括号内类型的至少1 个或多个字符。开头的^ 与结尾的$ 相结合告诉匹配从开始到结束的整个输入。所以给定的正则表达式匹配一个只包含集合字符的字符串。

    你想要的是这样的:

    /[^'"\s\-.*0-9\u00BF-\u1FFF\u2C00-\uD7FF\w]/g
    

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

    【讨论】: