web-dev-qa-db-ja.com

文字列から英数字以外の文字を削除します。 [\]文字に問題がある

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

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"
188
Bobby Cannon

英数字以外の文字の削除

以下は、入力文字列から英数字以外の文字を削除するための正しい正規表現です。

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

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

389
AD7six

現在のすべての答えにはまだ癖があります。私が思い付くことができる最も良いことは、次のとおりです。

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

私がキーボード上で見つけることができるすべてのキーを捉える例を挙げます。

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

出力: '123abcABC'

45
Deminetix

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

入力の最初のバックスラッシュだけがバックスラッシュ文字で、他のものは制御文字\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/

10
Guffa

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

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

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

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
0
Flavio