使用RegEx删除所有特殊字符

问题描述 投票:195回答:8

我想要一个将从字符串中删除所有特殊字符的RegExp。我尝试这样的东西,但它在IE7中不起作用,虽然它适用于Firefox。

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

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

RegExp的详细描述也很有用。

javascript regex special-characters
8个回答
554
投票
var desired = stringToReplace.replace(/[^\w\s]/gi, '')

正如评论中提到的那样,作为白名单更容易做到这一点 - 替换不在您的安全列表中的字符。

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


87
投票

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

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

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


18
投票

Plain Javascript regex does not handle Unicode letters.

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

你真的不想删除这些字母和所有特殊字符。你有两次机会:

  • 在你的正则表达式中添加你不想删除的所有特殊字符, 例如:[^èéòàùì\w\s]
  • 看看xregexp.com。 XRegExp通过\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>

7
投票

第一种解决方案不适用于任何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:当我进行模糊搜索时,我找到了原始解决方案。如果您还尝试删除特殊字符以实现搜索功能,则有一种更好的方法。使用任何transliteration library只能从拉丁字符产生字符串,然后简单的Regexp将完成删除特殊字符的所有魔法。 (这也适用于中国人,你也可以通过制作Tromsø == Tromso获得附带好处)。


1
投票

我使用RegexBuddy来调试我的正则表达式几乎所有语言都非常有用。比复制/粘贴目标语言。很棒的工具而且不是很贵。

所以我复制/粘贴你的正则表达式,你的问题是[,]是正则表达式中的特殊字符,所以你需要逃避它们。所以正则表达式应该是:/!@# $^&%*()+ = - [* x5B \ x5D] \ / {} |:<>?,。/ im


1
投票

str.replace(/\s|[0-9_]|\W|[#$%^&*()]/g, "")我做了这样的事。但是有些人比str.replace(/\W_/g,"");更容易做到这一点


0
投票

你为什么不这样做:

re = /^[a-z0-9 ]$/i;
var isValid = re.test(yourInput);

检查您的输入是否包含任何特殊字符


-7
投票

使用正则表达式^[^/\\()~!@#$%^&*{«»„““”‘’|\n\t….,;`^"<>'}+:?®©]*$

© www.soinside.com 2019 - 2024. All rights reserved.