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

スクリプトエラー?デバッグしましたか?または、JavaScriptコードにtry ... catchブロックを挿入します。
カンカン

@ Ape-
inagoでは

3
「特殊文字」を定義してください!「風」はあなたにとって特別ですか?(これについて考えると、@ Ape-iangoのポイントが表示されます。)
deceze

7
ここで誰かが犯罪を意味したとは思いません。私は前にそれをブラックリストとしてやることによってやけどを負ったことがあります。結局、正しいアプローチは、なぜこれを行おうとしているのかということです。
Ape-in​​ago 2010

回答:


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

コメントで述べたように、これをホワイトリストとして実行する方が簡単です- セーフリストにない文字を置き換えます。

キャレット(^)文字は、セットの否定であり[...]giたとえば、グローバルで大文字と小文字を区別しません(後者は少し冗長ですが、言及したかったのです)。この例のセーフリストは、数字、単語文字、アンダースコア(\w)および空白(\s)。


50
このソリューションは、英語以外の記号では機能しません。たとえば「Їжак」。
カモメ

4
^ \ wの代わりに大文字の\ Wを使用することもできます。\ W:単語以外の文字と一致します。[^ A-Za-z0-9_]と同じです。developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/...
delkant

@Seagull Unicodeを処理する回答を追加しました。
freedev 2016年

1
ポルトガル語のようにアクセント語を受け入れるには、次のようにします。stringToReplace.replace(/ [^A-zÀ-ú\ s] / gi、 '')
alansiqueira27

1
ほとんどのヨーロッパ言語(ノルウェー語、スウェーデン語、ドイツ語、Portoguise、スペイン語)を追加するにはstringToReplace.replace(/ [^ \ w \ s \ xc0-xff] / gi、 '')。他の言語を含めるには、ユニコード範囲を使用できます。参照:stackoverflow.com/questions/150033/...
Eskil Mjelva Saatvedt

105

スラッシュや特殊文字などを含めてセットを除外したい場合は、次のようにすることができます。

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

「マイナス」文字も含めるには、後者のグループのようにバックスラッシュでエスケープする必要があることに注意してください。そうでない場合は、0〜9も選択されますが、これはおそらく望ましくありません。


10
優れたソリューション!受け入れられた回答は英語でのみ機能し、これはすべての言語で機能します(私が確認した限り)。感謝:)
Ronen Ness

1
@knutole ?は、文字セット部分を前面に向かって削除します。これにより、削除する文字が一覧表示されるため、削除されないように除外すると、最終的に結果に含まれます。
noinput 2016年

これはうまく機能し、どの言語にも完全に適合します。置き換える文字を追加するだけで、それですべてです。ありがとう。
Elros Romeo

21

単純なJavascript正規表現はUnicode文字を処理しません

は使用しないでください。これにより[^\w\s]、キリル文字や中国語は言うまでもなく、アクセント付きの文字(àèéìòùなど)が削除されます。そのような言語からの文字は完全に削除されます。

これらの文字をすべての特殊文字と一緒に削除したくない場合は、次の2つの可能性があります。

  • 削除したくないすべての特殊文字を正規表現に追加します。
    例:[^èéòàùì\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正規表現がUTF-8に対応していないとは思いもしませんでした。
LessQuesar 2017年

すべての有効なUTF-8文字を変数strに入れることはできません
Seagull

@Seagullはい、ただし、世界規模の互換性のあるアプリケーションを作成していない場合は、現在のローカリゼーションに有効なUTF-8文字のリストのみを実用的に配置できます。私の場合、イタリア語の文字はほとんどありません。
freedev 2018年

7

最初のソリューションは、UTF-8アルファベットでは機能しません。(Itакなどのテキストをカットします)。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

漢字はこれによって取り除かれる1つの例です
レセック

このソリューションを作成したとき、残念ながら中国語などの言語については考えていませんでした。以前の回答も機能しないため、ソリューションを提案する必要があります。
カモメ

1

私はRegexBuddyを使用して正規表現をデバッグします。ほとんどすべての言語が非常に便利です。ターゲット言語のコピー/貼り付けよりも。素晴らしいツールであり、それほど高価ではありません。

だから私はあなたの正規表現をコピー/貼り付けました、そしてあなたの問題は[、]が正規表現の特殊文字なので、あなたはそれらをエスケープする必要があるということです。したがって、正規表現は/!@#$^&%*()+=-[\x5B\x5D]\/{}|:<>?,./im


0

なぜあなたは次のようなことをしないのですか?

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

入力に特殊文字が含まれているかどうかを確認するには


17
OPは、存在するかどうかを確認できない特殊文字を削除しようとしていると述べています。
annakata

これは良い解決策の1つですが、これは英字の数字とスペースのみを許可しますが、などの文字を削除èéòàùìし、場合によってはこれが解決策ではありません
mapmalith

0

str.replace(/\s|[0-9_]|\W|[#$%^&*()]/g, "")私はこのようにした。しかし、それをはるかに簡単にした人もいますstr.replace(/\W_/g,"");


\Wいくつかの文字が含まれているため、アプローチのほとんどは冗長です。しかし、なぜ数値を除外するのでしょうか?それらは特殊文字ではありません。
user4642212 2018年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.