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


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"

多步尝试

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"

有趣的问题是,\ new中的\ n显然是导致此问题的原因。我不确定如何找到和替换正则表达式
Will Buck

1
输入是否转义/如何分配?var Input = "\\test\red\bob\fred\new"此字符串不包含“红色”,因此您的第1次尝试是正确的,是否正在对乱扔垃圾进行测试"\\\\test\\red\\bob\\fred\\new"
Alex K.

/[^\w\s]+/gi试试这个。
Bartosz Grzybowski12年

我想问题是,输入字符串中的反斜杠代表特殊字符吗?(根据您的示例输出,我想不是。)
Dave

试图从双引号切换到单引号?
OptimusCrime 2012年

Answers:


467

删除非字母数字字符

以下是/正确的正则表达式,用于从输入字符串中剥离非字母数字字符:

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 2013年

4
@kylex,这是因为某些原因,下划线被认为是字母数字
字符串的

12
“因为它们是变量标识符中通常合法的字符”。。有没有“_”的问题,当然更换的\W[_\W](这是在问题中使用)或类似的将删除下划线。
AD7six 2013年

1
@ AD7six,您能否详细说明为什么当字符串来自不受信任的来源时,为什么应该使用JSON.stringify()?是否有安全隐患?谢谢!
jbmusso

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, '');因为它可以从字符串中删除所有非字母数字字符,因此效果更好。
蒂姆(Tim)

1
但是,这个答案的排列并不能真正回答所提出的问题
AD7six

10

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

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

由于这些反斜杠不是单独的字符,而是编写单个控制字符的部分符号,因此不能单独删除它们。也就是说,您不能从中删除反斜杠,\n因为它不是两个单独的字符,这是编写控制字符LF换行符的方式

如果您想将该输入转换为所需的输出,则需要将每个控制字符替换为相应的字母,例如\n,将字符替换为character 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

1
@ AD7six感谢您指出我的错误。当我将输入复制粘贴到WebStrom时,它会自动向每个现有的反斜杠添加2个额外的反斜杠。我没有对此感到高兴。输入=“ \\ 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时,您的字符串实际上包含单个反斜杠。” ??? 这不是解释吗?
shift66'2012-2-20

输入为“ \\ test \ red \ bod \ fred \ new”,并且无法更改。我需要该输入字符串的解决方案。如果您想告诉我如何“反斜杠”,请举个例子。我们无法更改输入。请参阅已接受的答案。解决方案允许输入保持不变,但提供所需的输出。
鲍比·坎农
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.