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.