使用 RegExp 删除所有特殊字符

IT技术 javascript regex special-characters
2021-02-04 07:05:52

我想要一个可以从字符串中删除所有特殊字符的 RegExp。我正在尝试这样的事情,但它在 IE7 中不起作用,尽管它在 Firefox 中有效。

var specialChars = "!@#$^&%*()+=-[]\/{}|:<>?,.";

for (var i = 0; i < specialChars.length; i++) {
  stringToReplace = stringToReplace.replace(new RegExp("\\" + specialChars[i], "gi"), "");
}

RegExp 的详细描述也会有所帮助。

6个回答
var desired = stringToReplace.replace(/[^\w\s]/gi, '')

正如评论中提到的,将其作为白名单更容易 - 替换不在安全列表中的字符

插入符号 ( ^) 字符是 set 的否定[...]gi比如全局和不区分大小写的(后者有点多余,但我想提一下),本例中的安全列表是数字、单词字符、下划线 ( \w) 和空格 ( \s)。

要接受重音词,例如葡萄牙语,请执行以下操作: stringToReplace.replace(/[^A-zÀ-ú\s]/gi, '')
2021-03-17 07:05:52
考虑到我不想要任何口音/特价,最适合我。我什至不想要空间,我删除了\s
2021-03-20 07:05:52
此解决方案不适用于非英文符号。例如“Їжак”。
2021-04-01 07:05:52
您也可以使用大写 \W 代替 ^\w。\W :匹配任何非单词字符。相当于 [^A-Za-z0-9_]。developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/...
2021-04-02 07:05:52
添加大多数欧洲语言(挪威语、瑞典语、德语、波尔图吉斯语、西班牙语)stringToReplace.replace(/[^\w\s\xc0-xff]/gi, '')。要包括其他语言,可以使用 unicode 范围。请参阅:stackoverflow.com/questions/150033/...
2021-04-10 07:05:52

请注意,如果您仍想排除一个集合,包括斜杠和特殊字符之类的内容,您可以执行以下操作:

var outString = sourceString.replace(/[`~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, '');

请特别注意,为了还包括“减号”字符,您需要像后一组一样使用反斜杠对其进行转义。如果你不这样做,它也会选择 0-9 这可能是不受欢迎的。

@knutole?从字符集部分朝前面删除这列出了您要删除的字符,因此将其排除在剥离之外将本质上将其包含在最终结果中。
2021-03-13 07:05:52
这很好用,非常适合任何语言,只需要添加要替换的字符即可。谢谢。
2021-03-17 07:05:52
我将如何在搜索输入上实现这一点?如何针对此 RegEx 测试输入?
2021-04-04 07:05:52
优秀的解决方案!接受的答案仅适用于英语,这适用于任何语言(据我检查)。谢谢 :)
2021-04-09 07:05:52

纯 Javascript 正则表达式不处理 Unicode 字母

不要使用[^\w\s],这将删除带重音的字母(如 àèéìòù),更不用说西里尔文或中文了,来自此类语言的字母将被完全删除。

您真的不想将这些字母与所有特殊字符一起删除。你有两个机会:

  • 在您的正则表达式中添加您不想删除的所有特殊字符,
    例如:[^èéòàùì\w\s].
  • 看看xregexp.comXRegExp 通过\p{...}语法添加了对 Unicode 匹配的基本支持

var str = "Їжак::: résd,$%& adùf"
var search = XRegExp('([^?<first>\\pL ]+)');
var res = XRegExp.replace(str, search, '',"all");

console.log(res); // returns "Їжак::: resd,adf"
console.log(str.replace(/[^\w\s]/gi, '') ); // returns " rsd adf"
console.log(str.replace(/[^\wèéòàùì\s]/gi, '') ); // returns " résd adùf"
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.1.1/xregexp-all.js"></script>

您不能将所有有效的 UTF-8 字母放入 var str
2021-03-13 07:05:52
@Seagull 是的,但如果您不编写全球兼容的应用程序,您可以务实地只为您当前的本地化放置有效的 UTF-8 字母列表。就我而言,意大利语只有几个字母。
2021-03-29 07:05:52
很高兴知道国际化,我不知道 JS 正则表达式不是 UTF-8。
2021-04-02 07:05:52

第一个解决方案不适用于任何 UTF-8 字母表。(它将剪切文本,例如 Їжак)。我设法创建了一个不使用 RegExp 并在 JavaScript 引擎中使用良好的 UTF-8 支持的函数。这个想法很简单,如果一个符号的大小写相等,那么它就是一个特殊字符。唯一的例外是空白。

function removeSpecials(str) {
    var lower = str.toLowerCase();
    var upper = str.toUpperCase();

    var res = "";
    for(var i=0; i<lower.length; ++i) {
        if(lower[i] != upper[i] || lower[i].trim() === '')
            res += str[i];
    }
    return res;
}

更新:请注意,此解决方案仅适用于有小写和大写字母的语言。在像中文这样的语言中,这是行不通的。

更新 2:当我进行模糊搜索时,我来到了原始解决方案。如果您还尝试删除特殊字符以实现搜索功能,则有更好的方法。使用任何可以仅从拉丁字符生成字符串的音译库,然后简单的 Regexp 将完成删除特殊字符的所有魔术。(这也适用于中国人,你也可以通过制作Tromsø==获得额外的好处Tromso)。

太好了,喜欢这个答案!我使用它来创建有效的文件名,并扩展您的解决方案以删除空格(Linux/Unix 兼容)并允许数字。所以我扩展了 if 语句(涉及 jQuery): if(str[i] !== ' ' && (lower[i] != upper[i] || lower[i].trim() === '' | | $.isNumeric(str[i])))
2021-03-14 07:05:52
汉字是被剥离的一个例子
2021-03-16 07:05:52
不幸的是,当我创建这个解决方案时,我并没有考虑像中文这样的语言。必须提出解决方案,因为以前的答案也不起作用。
2021-03-31 07:05:52
在许多语言中没有大写字母...因此该函数会将有效输入视为特殊字符
2021-04-04 07:05:52

使用\W[a-z0-9]正则表达式不适用于中文等非英语语言,

最好在正则表达式中使用所有特殊字符并将它们从给定的字符串中排除

str.replace(/[~`!@#$%^&*()+={}\[\];:\'\"<>.,\/\\\?-_]/g, '');