RegExp로 모든 특수 문자 제거


234

문자열에서 모든 특수 문자를 제거하는 RegExp를 원합니다. 나는 이와 같은 것을 시도하고 있지만 IE7에서는 작동하지 않지만 Firefox에서는 작동합니다.

var specialChars = "!@#$^&%*()+=-[]\/{}|:<>?,.";

for (var i = 0; i < specialChars.length; i++) {
  stringToReplace = stringToReplace.replace(new RegExp("\\" + specialChars[i], "gi"), "");
}

RegExp에 대한 자세한 설명도 도움이 될 것입니다.


18
이와 같은 것은 블랙리스트가 아닌 화이트리스트로 사용하는 것이 좋습니다. 그러면 당신은 [az] | [0-9] | \ s
— Ape-inago를 할 수 있습니다

스크립트 오류가 있습니까? 디버깅 했습니까? 또는 자바 스크립트 코드에 try ... catch 블록을 넣으십시오.
— Kangkan

@ Ape-inago 당신은 RegExp를 좀 더 설명해주세요.
— Timothy Ruhle

3
"특수 캐릭터"를 정의하십시오! "風"이 당신에게 특별한가요? (이것에 대해 생각하면 @ Ape-iango의 요점이 보일 것입니다.)
— deceze

7
나는 여기 누구도 범죄를 의미하지 않았다고 생각합니다. 나는 블랙리스트로 그것을 수행함으로써 이전에 화상을 입었습니다. 왜냐하면 항상 (죽음의 예와 같이) 통과하는 작은 "gotcha 's"가 있기 때문입니다. 궁극적으로 올바른 접근 방식은 왜 당신이 이것을하려고하는지에 관한 것입니다.
— Ape-inago

답변:


612
var desired = stringToReplace.replace(/[^\w\s]/gi, '')

의견에서 언급했듯이 허용 목록으로 사용하는 것이 더 쉽습니다 . 수신 허용 목록에 없는 문자를 바꾸십시오 .

캐럿 ( ^) 문자 세트의 부정이다 [...], gi라고 세계와 대소 문자를 구별 (후자는 약간의 중복하지만 난 그것을 언급하고 싶었)이 예에서는 수신 허용 목록은 숫자, 단어 문자, 밑줄 (이다 \w)와 공백 ( \s).


50
영어 이외의 기호에는이 솔루션이 작동하지 않습니다. 예를 들어 "Їжак".
— 갈매기 갈매기

4
^ \ w 대신 대문자 \ W를 사용할 수도 있습니다. \ W : 단어가 아닌 문자와 일치합니다. [^ A-Za-z0-9_]와 같습니다. developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/…
— delkant

@Seagull 유니 코드를 처리하는 답변을 추가했습니다.
— freedev

1
포르투갈어와 같이 억양 단어를 받아들이려면 다음과 같이하십시오 : stringToReplace.replace (/ [^ A-zÀ-ú \ s] / gi, '')
— alansiqueira27

1
대부분의 유럽 언어 (노르웨이어, Sweedish, 독일어, Portoguise, 스페인어)를 추가하려면 stringToReplace.replace (/ [^ \ w \ s \ xc0-xff] / gi, ''). 다른 언어를 포함시키기 위해 유니 코드 범위가 사용될 수 있습니다. 참조 : stackoverflow.com/questions/150033/…
— Eskil Mjelva Saatvedt

105

슬래시 및 특수 문자와 같은 것을 포함하여 세트를 여전히 제외하려면 다음을 수행 할 수 있습니다.

var outString = sourceString.replace(/[`~!@#$%^&*()_|+\-=?;:'",.<>\{\}\[\]\\\/]/gi, '');

"빼기"문자도 포함 시키려면 후자의 그룹과 같이 백 슬래시로 이스케이프 처리해야합니다. 그렇지 않으면 바람직하지 않은 0-9도 선택합니다.


10
훌륭한 솔루션! 허용 된 답변은 영어로만 작동하며 모든 언어에서 작동합니다 (체크 한 한). 고마워요 :)
— Ronen Ness

1
@knutole을 ?문자 세트 부분에서 앞쪽으로 제거하십시오 . 여기에는 제거하려는 문자가 나열되므로 제거하지 않고 제외하면 본질적으로 최종 결과에 해당 문자가 포함됩니다.
— noinput

이것은 훌륭하게 작동하고 모든 언어에 완벽하게 맞습니다. 교체하려는 문자를 추가하면됩니다. 감사.
— Elros Romeo 2016

21

일반 Javascript 정규식은 유니 코드 문자를 처리하지 않습니다 .

를 사용하지 않으면 [^\w\s]키릴 문자 나 중국어는 말할 것도없고 악센트가있는 문자 (예 : èèìòù)가 제거되고 해당 언어에서 온 문자는 제거됩니다.

이 문자들을 모든 특수 문자와 함께 제거하고 싶지는 않습니다. 두 가지 기회가 있습니다.

  • 당신의 정규식에서 제거를하지 않는 모든 특수 문자를 추가
    예를 들면 다음과 같습니다 [^èéòàùì\w\s].
  • xregexp.com을 살펴 보십시오 . XRegExp는 \p{...}구문을 통해 유니 코드 일치에 대한 기본 지원을 추가 합니다.

var str = "Їжак::: résd,$%& adùf"
var search = XRegExp('([^?<first>\\pL ]+)');
var res = XRegExp.replace(str, search, '',"all");

console.log(res); // returns "Їжак::: resd,adf"
console.log(str.replace(/[^\w\s]/gi, '') ); // returns " rsd adf"
console.log(str.replace(/[^\wèéòàùì\s]/gi, '') ); // returns " résd adùf"
<script src="https://cdnjs.cloudflare.com/ajax/libs/xregexp/3.1.1/xregexp-all.js"></script>


3
국제화에 대해 잘 알고 있기 때문에 JS 정규 표현식이 UTF-8이 아니었다는 것을 몰랐습니다.
— LessQuesar

유효한 모든 UTF-8 문자를 var str에 넣을 수는 없습니다
— Seagull

@Seagull 예. 그러나 전 세계적으로 호환되는 응용 프로그램을 작성하지 않는 경우 현재 현지화에 유효한 UTF-8 문자 목록 만 실용적으로 넣을 수 있습니다. 필자의 경우 이탈리아어의 경우 글자가 거의 없습니다.
— freedev

7

첫 번째 솔루션은 UTF-8 알파벳에 대해 작동하지 않습니다. Їжак와 같은 텍스트를 잘라냅니다. RegExp를 사용하지 않고 JavaScript 엔진에서 우수한 UTF-8 지원을 사용하는 함수를 만들었습니다. 기호가 대문자와 소문자가 같으면 특수 문자입니다. 공백은 예외입니다.

function removeSpecials(str) {
    var lower = str.toLowerCase();
    var upper = str.toUpperCase();

    var res = "";
    for(var i=0; i<lower.length; ++i) {
        if(lower[i] != upper[i] || lower[i].trim() === '')
            res += str[i];
    }
    return res;
}

업데이트 : 이 솔루션은 대문자와 소문자가있는 언어에서만 작동합니다. 중국어와 같은 언어에서는 작동하지 않습니다.

업데이트 2 : 퍼지 검색을 할 때 원래 솔루션을 찾았습니다. 검색 기능을 구현하기 위해 특수 문자를 제거하려는 경우 더 나은 방법이 있습니다. 라틴 문자에서만 문자열을 생성 하는 음역 라이브러리 를 사용 하면 간단한 Regexp가 특수 문자를 제거하는 모든 마술을 수행합니다. (이것은 중국어에도 적용되며 Tromsø== 를 만들어 부수적 혜택을받을 수도 있습니다 Tromso).


이 답변처럼 훌륭합니다! 유효한 파일 이름을 만드는 데 사용하고 공백을 제거하고 (Linux / Unix 호환 가능) 숫자를 허용하도록 솔루션을 확장했습니다. 그래서 if 문을 확장했습니다 (jQuery 관련) : if (str [i]! == ''&& (lower [i]! = upper [i] || lower [i] .trim () === ''| $ .isNumeric (str [i]))
— Jonny

많은 언어에는 대문자가 없습니다 ... 따라서 함수는 유효한 입력을 특수 문자로 간주합니다
— Yair Levy

중국어 문자는 이것에 의해 제거되는 한 예입니다
— lethek

이 솔루션을 만들었을 때 불행히도 중국어와 같은 언어는 생각하지 않았습니다. 이전 답변도 효과가 없으므로 해결책을 제안해야합니다.
— Seagull

1

정규식을 디버깅하기 위해 RegexBuddy를 사용합니다. 거의 모든 언어가 매우 유용합니다. 대상 언어의 복사 / 붙여 넣기보다. 굉장한 도구이며 비용이 많이 들지 않습니다.

그래서 정규식을 복사 / 붙여 넣기하고 문제는 [,]가 정규식의 특수 문자이므로 이스케이프 처리해야합니다. 따라서 정규식은 /!@#$^&%*()+=-[\x5B\x5D]\/{}|:<>?,./im이어야합니다.


0

왜 당신은 다음과 같은 일을하지 마십시오 :

re = /^[a-z0-9 ]$/i;
var isValid = re.test(yourInput);

입력에 특수 문자가 포함되어 있는지 확인


17
OP는 특수 문자가 있는지 확인하지 않고 특수 문자를 제거하려고한다고 말합니다.
— annakata

이것은 좋은 해결책 중 하나이지만 영어 알파벳 문자 숫자와 공백 만 허용하지만 같은 문자를 제거 èéòàùì하고 어떤 경우에는 해결책이되지 않습니다
— mapmalith

0

str.replace(/\s|[0-9_]|\W|[#$%^&*()]/g, "")나는 이렇게 했어요. 하지만 훨씬 쉬운 사람들이 있습니다str.replace(/\W_/g,"");


\W일부 문자가 포함되어 있으므로 접근 방식의 대부분은 중복 됩니다. 그런데 왜 숫자를 걸러 내겠습니까? 그것들은 특별한 인물이 아닙니다.
— user4642212
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.