使用RegExp删除所有特殊字符

我想要一个RegExp,它将从字符串中删除所有特殊字符。我正在尝试这样的东西,但它在IE7中不工作,尽管它在Firefox中工作。

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


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

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

623471 次浏览

我使用RegexBuddy来调试我的正则表达式,它几乎所有的语言都非常有用。而不是复制/粘贴目标语言。

所以我复制/粘贴了你的正则表达式,你的问题是[,]是正则表达式中的特殊字符,所以你需要转义它们。因此,正则表达式 : /!@#$^& amp ;%*()+=-[\ x5B \ x5D] \ / {} |: & lt; > ?,。/我

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

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

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

你为什么不做这样的事情:

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

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

注意,如果你仍然想排除一个集合,包括斜杠和特殊字符,你可以执行以下操作:

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

需要特别注意的是,为了也包括“减号”字符,你需要像后面一组一样用反斜杠转义它。如果你不这样做,它也会选择0-9,这可能是不希望的。

第一种解决方案不适用于任何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获得额外的好处)。

纯Javascript regex不处理Unicode字母

不要使用[^\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>

我做了这样的事。 但是有些人做得更容易,比如str.replace(/\W_/g,"");

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

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

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

@海鸥回答(https://stackoverflow.com/a/26482552/4556619) 看起来不错,但当有一些特殊(土耳其语)字符时,你会得到未定义的字符串结果。

let str="bənövşəyi 😟пурпурный İdÖĞ";

我稍微改进它和补丁与未定义的检查。

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


let res = "",i=0,n=lower.length,t;
for(i; i<n; ++i) {
if(lower[i] !== upper[i] || lower[i].trim() === ''){
t=str[i];
if(t!==undefined){
res +=t;
}
}
}
return res;
}
text.replace(/[`~!@#$%^*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, '');