从字符串中移除非字母数字字符

我想将下面的字符串转换为提供的输出。

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"

另一次尝试有多个步骤

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"
316951 次浏览
如果你想拥有这个\\test\red\bob\fred\new字符串,你应该转义所有的反斜杠(\)。当你写\\test\\red\\bob\\fred\\new时,你的字符串实际上包含一个反斜杠。你可以确保打印你的字符串。
因此,如果字符串中的反斜杠被转义,myString.replace(/\W/g,'')将正常工作

删除非字母数字字符

下面是从输入字符串中剥离非字母数字字符的/a正确正则表达式:

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

但是它们也会被替换正则表达式删除。

问题不在于如何替换字符,而在于如何输入字符串。

输入中只有第一个反斜杠字符是反斜杠字符,其他都是控制字符\r\b\f\n的一部分。

由于这些反斜杠不是单独的字符,而是编写单个控制字符的符号的一部分,因此不能单独删除它们。也就是说,你不能从\n中删除反斜杠,因为它不是两个独立的字符,这是你编写控制字符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/

目前所有的答案都有怪癖,我能想到的最好的答案是:

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

下面的例子囊括了我能在键盘上找到的每个键:

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

输出:“123 abcabc”。

你可以试试这个正则表达式:

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

这将删除所有非字母数字字符,保留大写并保留单词之间的空格。

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

这里有一个你可以用的例子,

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


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

要包含阿拉伯字母和英语字母,你可以使用:

// Output: نصعربي
"ن$%^&*(ص ع___ربي".replace(/[^0-9a-z\u0600-\u06FF]/gi, '');

如果你有除英语以外的其他语言的情况,你需要添加相对块范围从unicode。下面是一个西里尔字母的例子:

.replace(/[^0-9A-Za-z_\u0400-\u04FF]/gi, '')

你可以使用\p{L}\p{Letter}查找来自任何语言的字母,使用\d查找数字。

str.replace(/[^\p{L}\d]/gu, '')

^对字符集求反:not \P{L} and not \d

国旗:

  • g (global)执行尽可能多的替换作为必要的
  • u (unicode)来识别Unicode转义序列(如\p{L})。
< p >的例子:
function removeNonAlphaNumeric (str) {
return str.replace(/[^\p{L}\d]/gu, '')
}


sequences = [
'asdé5kfjdk?',
'uQjoFß^ßI$jI',
'无论3如何?!',
'фв@#ео1'
]


for (seq of sequences) {
console.log(removeNonAlphaNumeric(seq))
}