문자열에서 영숫자가 아닌 문자 제거


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"

흥미로운 질문은 \ n의 \ n이 이것을 잘못 넘어간 것입니다. 나는 whitespate 특수 문자에 대한 정규식을 검색
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는 밑줄이 영숫자 무리의 일부로 간주되기 때문입니다.
Eugene Kuzmenko

12
"이는 일반적으로 변수 식별자에서 유효한 문자이기 때문에" . 물론 교체의 질문에 "_"전혀 없습니다 \W[_\W](질문에 사용되는)하거나 제거 할 유사한 밑줄.
AD7six

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를 문자 로 바꿉니다) 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에서 프로그래밍 방식으로 입력을 변경하는 방법에 대한 답변을 제안하는 사람은 없습니다.
Bobby Cannon

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
"모든 백 슬래시 ()를 이스케이프해야 함"을 제안하려면이를 수행하는 방법에 대한 예를 제공해야합니다.
Bobby Cannon

이중 역 슬래쉬 란 무엇입니까? "\\ test \\ red \\ bob \\ fred \\ new를 쓸 때 문자열에는 실제로 단일 백 슬래시가 포함됩니다." ??? 설명이 안 되나요?
shift66

입력은 "\\ test \ red \ bod \ fred \ new"이며 변경할 수 없습니다. 해당 입력 문자열에 대한 솔루션이 필요합니다. "백 슬래시를 이스케이프 처리"하는 방법을 보여주고 싶다면 예제를 제공하십시오. 입력을 변경할 수 없습니다. 허용 된 답변을 참조하십시오. 솔루션은 입력이 변경되지 않도록하지만 원하는 출력을 제공했습니다.
Bobby Cannon
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.