使用RegExp删除所有特殊字符


234

我想要一个RegExp,它将从字符串中删除所有特殊字符。我正在尝试类似的方法,但是它在IE7中不起作用,尽管它在Firefox中有效。

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

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

RegExp的详细说明也将有所帮助。


18
这样的事情最好作为白名单,而不是黑名单。那么您只需执行[az] | [0-9] | \ s
Ape-in​​ago 2010年

任何脚本错误?你调试了吗?否则在JavaScript代码中放置try ... catch块。
康坎

@ Ape-in​​ago,能否请您向我详细介绍RegExp
Timothy Ruhle 2010年

3
请定义“特殊字符”!“风”特别适合您吗?(考虑这一点,您会看到@ Ape-iango的观点。)
deceze

7
我认为这里没有任何人有任何罪行。以前我总是把它当作黑名单,所以很生气,因为总有一些小“陷阱”最终通过(像deceze的例子一样)。最终,正确的方法更多地是关于您为什么要这样做的原因。
Ape-in​​ago

Answers:


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

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

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


50
此解决方案不适用于非英文符号。例如“Їжак”。
海鸥2014年

4
您也可以使用大写\ W代替^ \ w。\ W:匹配任何非单词字符。等效于[^ A-Za-z0-9_]。developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…–
delkant

@Seagull我添加了一个处理Unicode的答案。
freedev

1
接受重音词(例如葡萄牙语),请执行以下操作:stringToReplace.replace(/ [^A-zÀ-s\ s] / gi,'')
alansiqueira27年

1
要添加大多数欧洲语言(挪威语,瑞典语,德语,Portoguise,西班牙语)stringToReplace.replace(/ [^ \ w \ s \ xc0-xff] / gi,'')。要包括其他语言,可以使用unicode范围。请参阅:stackoverflow.com/questions/150033/...
Eskil Mjelva Saatvedt

105

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

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

需要特别注意的是,为了同时包含“减号”字符,您需要像后面的组一样使用反斜杠对其进行转义。如果您不这样做,它还会选择0-9,这可能是不希望的。


10
极好的解决方案!接受的答案仅适用于英语,适用于任何语言(据我检查)。谢谢:)
罗恩·内斯

1
@knutole ?从字符集部分中朝前删除。这会列出您要删除的字符,因此将其排除在剥离之外,最终会将其包括在最终结果中。
noinput

这很好用,非常适合任何语言,只需要添加要替换的字符即可,仅此而已。谢谢。
Elros Romeo

21

纯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>


3
很高兴了解国际化,我不知道JS regex不是UTF-8的。
LessQuesar

您不能将所有有效的UTF-8字母放入var str
Seagull

@Seagull是的,但是如果您不编写与全球兼容的应用程序,则可以针对您的当前本地化实用地放置仅有效UTF-8字母的列表。就我而言,对于意大利语,只有几个字母。
freedev

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:在进行模糊搜索时,我采用了原始解决方案。如果您还尝试删除特殊字符以实现搜索功能,则有更好的方法。使用任何音译库,该只会从拉丁字符中产生字符串,然后简单的Regexp就可以消除所有特殊字符。(这也适用于中文,并且使用Tromsø== 也将获得附带好处Tromso)。


很好,喜欢这个答案!我用它来创建有效的文件名,并将它扩展到解决方案中以删除空格(与Linux / Unix兼容)并允许数字。因此,我扩展了if语句(涉及jQuery):if(str [i]!==''&&(lower [i]!= upper [i] || lower [i] .trim()===''| | $ .isNumeric(str [i])))
Jonny

在许多语言中,没有大写字母...因此该功能会将有效输入视为特殊字符
Yair Levy,

汉字就是一个由此而被剥夺的例子
lethek '18

不幸的是,当我创建这个解决方案时,我并没有考虑像中文这样的语言。由于先前的答案也不起作用,因此必须提出解决方案。
海鸥

1

我使用RegexBuddy对我的正则表达式进行调试,它几乎具有所有有用的语言。比复制/粘贴目标语言。很棒的工具,也不是很昂贵。

因此,我复制/粘贴了您的正则表达式,您的问题是[,]是正则表达式中的特殊字符,因此您需要对其进行转义。因此正则表达式应为:/!@#$^&%*()+=-[\x5B\x5D]\/{}|:<>?../im


0

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

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

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


17
OP说他正在尝试删除特殊字符,看看它们是否存在。
annakata 2010年

这是一个很好的解决方案,但是它只允许使用英文字母和数字,但会删除类似的字符èéòàùì,在某些情况下,这不是解决方案
mapmalith

0

str.replace(/\s|[0-9_]|\W|[#$%^&*()]/g, "")我确实是这样 但是有些人做起来容易得多str.replace(/\W_/g,"");


您的方法中的大多数事情都是多余的,因为\W其中包含一些字符。但是,为什么要过滤掉数字?这些不是特殊字符。
user4642212
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.