文字列から英数字ではない文字を削除します


224

次の文字列を提供された出力に変換したい。

Input:  "\\test\red\bob\fred\new"
Output: "testredbobfrednew"

私のような特殊文字が処理する任意の解決策が見つからないてきました\r\n\b、など

基本的に、英数字以外のものはすべて削除したいだけです。これが私が試したものです...

Attempt 1: "\\test\red\bob\fred\new".replace(/[_\W]+/g, "");
Output 1:  "testedobredew"

Attempt 2: "\\test\red\bob\fred\new".replace(/['`~!@#$%^&*()_|+-=?;:'",.<>\{\}\[\]\\\/]/gi, "");
Output 2:  "testedobred [newline] ew"

Attempt 3: "\\test\red\bob\fred\new".replace(/[^a-zA-Z0-9]/, "");
Output 3:  "testedobred [newline] ew"

Attempt 4: "\\test\red\bob\fred\new".replace(/[^a-z0-9\s]/gi, '');
Output 4:  "testedobred [newline] ew"

複数のステップでのもう1つの試み

function cleanID(id) {
    id = id.toUpperCase();
    id = id.replace( /\t/ , "T");
    id = id.replace( /\n/ , "N");
    id = id.replace( /\r/ , "R");
    id = id.replace( /\b/ , "B");
    id = id.replace( /\f/ , "F");
    return id.replace( /[^a-zA-Z0-9]/ , "");
}

結果とともに

Attempt 1: cleanID("\\test\red\bob\fred\new");
Output 1: "BTESTREDOBFREDNEW"

任意の助けいただければ幸いです。

実用的なソリューション:

Final Attempt 1: return JSON.stringify("\\test\red\bob\fred\new").replace( /\W/g , '');
Output 1: "testredbobfrednew"

興味深い質問ですが、\ nの\ nは明らかにこれを引き起こしているものです。ホワイトスペースの特殊文字で正規表現を検索
Will Buck

1
入力はエスケープされていますか/どのように割り当てられていますか?var Input = "\\test\red\bob\fred\new"この文字列には「赤」が含まれていないため、最初の試行は正しいですが、リテラルに対してテストしてい"\\\\test\\red\\bob\\fred\\new"ますか?
Alex K.

/[^\w\s]+/giこれを試して。
Bartosz Grzybowski

問題は、入力文字列のバックスラッシュが特殊文字を表しているのでしょうか。(あなたの出力例に基づいて、私は推測していません。)
Dave

二重引用符から単一引用符に切り替えてみましたか?
OptimusCrime

回答:


468

英数字以外の文字を削除する

次に、入力文字列から英数字以外の文字を取り除くための正しい正規表現を示します。

input.replace(/\W/g, '')

これ\Wはに相当します[^0-9a-zA-Z_]-アンダースコア文字を含みます。アンダースコアも削除するには、たとえば次のようにします。

input.replace(/[^0-9a-z]/gi, '')

入力が不正です

テスト文字列には、英数字ではないさまざまなエスケープ文字が含まれているため、それらは削除されます。

文字列内のバックスラッシュは、文字どおりに解釈する必要がある場合はエスケープする必要があります。

"\\test\\red\\bob\\fred\\new".replace(/\W/g, '')
"testredbobfrednew" // output

不正な形式の文字列の処理

入力文字列を正しくエスケープできない場合(そうでないのはなぜですか?)、またはそれが何らかの信頼されていない/正しく構成されていないソースからのものである場合は、次のようにすることができます。

JSON.stringify("\\test\red\bob\fred\new").replace(/\W/g, '')
"testredbobfrednew" // output

文字列のjson表現には引用符が含まれていることに注意してください。

JSON.stringify("\\test\red\bob\fred\new")
""\\test\red\bob\fred\new""

しかし、それらはまた、置換正規表現によって削除されます。


10
これはアンダースコアを削除しません。
kylex

4
@kylex、これは、何らかの理由で、アンダースコアが英数字の束の一部と見なされるためです
ユージーンクズメンコ

12
「これらは、変数識別子で通常有効な文字だからです。」。質問には "_"がありません。もちろん\W[_\W](質問で使用されている)と置き換えたり、同様のものを使用すると、アンダースコアが削除されます。
AD7six 2013年

1
@ AD7six、文字列が信頼できないソースからのものであるときにJSON.stringify()を使用する必要がある理由について詳しく説明していただけますか?そうしないことでセキュリティ上の懸念はありますか?ありがとう!
jbmusso 2013

1
@guithorそれは「すべき」ではなく、セキュリティにまったく影響を与えません。「何らかの文字列」が受信されていて、何らかの理由で基本的に失敗している場合(文字列が不正な形式で受信される理由は不明です)-文字列が何であるかを確認できます:jsfiddle.net/Z6N7C
AD7six

49

現在の答えのすべてはまだ癖があります、私が思いつくことができる最高のものは:

string.replace(/[^A-Za-z0-9]/g, '');

キーボードで見つけることができるすべてのキーをキャプチャする例を次に示します。

var string = '123abcABC-_*(!@#$%^&*()_-={}[]:\"<>,.?/~`';
var stripped = string.replace(/[^A-Za-z0-9]/g, '');
console.log(stripped);

出力: '123abcABC'


1
input.replace(/\W/g, '')_文字列の中に残します。@Deminetixはstring.replace(/[^A-Za-z0-9]/g, '');、文字列からすべての非英数字文字を削除するため、正しく機能します。
ティム

1
それでも、この回答の順列が実際に尋ねられた質問に答えることはありません。
AD7six

10

問題は、文字の置き換え方法ではなく、文字列の入力方法にあります。

それは他の人が制御文字の一部である、バックスラッシュ文字で入力中のみ最初のバックスラッシュだ\r\b\f\n

これらのバックスラッシュは個別の文字ではなく、単一の制御文字を記述する表記の一部であるため、個別に削除することはできません。\nつまり、2つの個別の文字ではないため、バックスラッシュを削除できません。これは、制御文字LFまたはラインフィードを記述する方法です。

その入力を実際に目的の出力に変換したい場合は、各制御文字を対応する文字に置き換える必要があります。たとえば、文字\nを文字に置き換えnます。

制御文字を置き換えるには、正規表現で特別な意味[\r]\r持つように、などの文字セットを使用する必要があります。

var input = "\\test\red\bob\fred\new";

var output = input
    .replace(/[\r]/g, 'r')
    .replace(/[\b]/g, 'b')
    .replace(/[\f]/g, 'f')
    .replace(/[\n]/g, 'n')
    .replace(/\\/g, '');

デモ:http : //jsfiddle.net/SAp4W/


私はあなたが言っているすべてを理解していますが、問題はまだ立っており、誰もまだ正しい答えを提案していません。入力は変更される可能性がありますが、JSでプログラムを使用して変更する方法についての回答はありません。
ボビーキャノン

2
@BobbyCannon:正確な入力を受け取り、目的の出力を生成するコードを追加しました。
Guffa

5

あなたはこの正規表現を試すことができます:

value.replace(/[\W_-]/g, '');

質問ごとに:英数字以外のものを取り除きたいだけです。どの出力を期待していましたか?
myrcutio

0

これにより、英数字以外のすべての文字が削除され、大文字と小文字が区別され、単語間のスペースが保持されます。

function alpha_numeric_filter (string) {

  const alpha_numeric = Array.from('abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' + ' ')

  const json_string = JSON.stringify(string)

  let filterd_string = ''

  for (let i = 0; i < json_string.length; i++) {

    let char = json_string[i]
    let index = alpha_numeric.indexOf(char)
    if (index > -1) {
      filterd_string += alpha_numeric[index]
    }

  }

  return filterd_string

}

const input = "\\test\red\bob\fred\new"
console.log(alpha_numeric_filter(input)) //=> testredbobfrednew

const complex_string = "/_&_This!&!! is!@#$% a%^&*() Sentence+=-[]{} 123:;\|\\]||~`/.,><"
console.log(alpha_numeric_filter(complex_string)) //=> This is a Sentence 123

これは機能しません(質問をお読みください)-これは、かなり複雑な方法でもあります。
AD7six 2018

1
@ AD7sixは私のエラーを指摘してくれてありがとう。入力をWebStromにコピーして貼り付けると、既存の各バックスラッシュに2つの追加のバックスラッシュが自動的に追加されました。私はこれに気づかなかった。input = "\\ test \ red \ bob \ fred \ new"-> copy_paste = "\\\\ test \\ red \\ bob \\ fred \\ new"。
Flavio、

-1

ここにあなたが使用できる例があります、

function removeNonAplhaNumeric(str){
    return str.replace(/[\W_]/g,"");
}

removeNonAplhaNumeric("0_0 (: /-\ :) 0-0");

-3

この\\test\red\bob\fred\new文字列が必要な場合は、すべてのバックスラッシュ(\)をエスケープする必要があります。\\test\\red\\bob\\fred\\new文字列を書くとき、実際には単一のバックスラッシュが含まれています。これで文字列を確実に出力できます。
したがって、文字列内のバックスラッシュがエスケープされている場合、myString.replace(/\W/g,'')正常に機能します。


1
「すべてのバックスラッシュ()をエスケープする必要がある」と提案したい場合は、その方法の例を提供する必要があります。
ボビーキャノン、

二重バックスラッシュとは何ですか??? そして、「\\ test \\ red \\ bob \\ fred \\ newと書いたとき、文字列には実際には単一のバックスラッシュが含まれています。」??? これは説明していませんか?
シフト66

入力は「\\ test \ red \ bod \ fred \ new」であり、変更できません。その入力文字列の解決策が必要です。「バックスラッシュを除外する」方法を教えたい場合は、例を挙げてください。入力を変更することはできません。受け入れられた答えを見てください。ソリューションは、入力が変更されないようにしましたが、望ましい出力を与えました。
ボビーキャノン、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.