영숫자가 아닌 문자, 줄 바꿈 및 여러 공백을 하나의 공백으로 바꿉니다.


136

교체 할 깔끔한 RegEx 솔루션을 찾고 있습니다.

  • 영숫자가 아닌 모든 문자
  • 모든 뉴 라인
  • 공백의 여러 인스턴스

하나의 공간으로


집에서 놀고있는 사람들을 위해 ( 다음은 효과가 있습니다 )

text.replace(/[^a-z0-9]/gmi, " ").replace(/\s+/g, " ");

내 생각은 RegEx 가 한 번의 진술로 이것을 달성 할만 큼 강력 할 것입니다. 내가 필요하다고 생각하는 구성 요소는

  • [^a-z0-9] -영숫자가 아닌 문자를 제거하려면
  • \s+ -모든 공간 컬렉션과 일치
  • \r?\n|\r -모든 줄 바꿈
  • /gmi -글로벌, 다중 라인, 대소 문자 구분

그러나 정규식을 올바른 방식으로 스타일을 지정할 수 없습니다 ( 다음은 작동하지 않습니다 )

text.replace(/[^a-z0-9]|\s+|\r?\n|\r/gmi, " ");


입력

234&^%,Me,2 2013 1080p x264 5 1 BluRay
S01(*&asd 05
S1E5
1x05
1x5


원하는 출력

234 Me 2 2013 1080p x264 5 1 BluRay S01 asd 05 S1E5 1x05 1x5

시도가 정확히 작동하지 않습니까? 무엇이 잘못 되었나요?
Pointy

답변:


235

\W 밑줄남습니다 . 에 해당하는 짧은 [^a-zA-Z0-9]것은[\W_]

text.replace(/[\W_]+/g," ");

\W단어 문자 (밑줄 포함) 의 속기 \w 입니다.[A-Za-z0-9_]

regex101.com의 예


그것을 확인하고 테스트하십시오, 아직 js-regex에 대한 경험이 많지 않습니다 : p 행복합니다
Jonny 5

6
참고 \W또한 비 단어 문자와 같은 비 - 라틴 문자를 인식합니다.
Tyblitz

1
나는 되돌아 보았고 허용 된 밑줄을 배제하지 않았기 때문에이 답변을 모두 올바른 해로 표시했습니다
TheGeneral

143

조니 5가 날 이겼어 내가 사용하는 것이 좋습니다 거라고 \W+포함하지 않는를 \s같이 text.replace(/\W+/g, " "). 이것은 공백도 포함합니다.


지적 해 주셔서 감사합니다 @ T-CatSan! 를 올렸하고, 사루만, 당신하든에 가장 좋은 대답을 자유롭게 변경할 수 :-) 그러나 그것이 있어야 \W+하지 [W+]글쎄, 새해 복 많이 받으세요 모두!
Jonny 5

감사합니다, @ Jonny5! 제안한 내용을 변경했습니다. 나는 전에 괄호로 테스트했으며 지금은 괄호없이 작동합니다. 새해 복 많이 받으세요.
T-CatSan

1
안녕하세요 @ T-CatSan 예외를 추가하는 방법이 있습니까? 나는 문자를 유지하려면 &-. 팁이 있습니까?
Renato Gama

1
_도 무시하도록 / (\ W +) | (_) / g를 다음과 같이 변경했습니다. 그러나 왜 첫 번째 모델에서 무시하지 않는지 궁금하고 내 정규 표현식이 효율적인 모델입니다.
Sridhar Gudimela

14

[^a-z0-9]문자 클래스에는 숫자가 아닌 문자가 모두 포함 되므로 흰색 문자도 포함됩니다!

 text.replace(/[^a-z0-9]+/gi, " ");

6

글쎄, 당신은 각 패턴에 한정자를 추가해야한다고 생각합니다. 또한 캐리지 리턴은 약간 재미 있습니다.

text.replace(/[^a-z0-9]+|\s+/gmi, " ");

편집\s 일 경기를 \r하고 \n도.


예, 그 주제에 대한 다른 답변에서 얻은 톰 바보가 있었지만 큰 도움이되었습니다!
일반

2

분음 표시가있는 다른 게시물을 보았습니다.

s.replace(/[^a-zA-Z0-9À-ž\s]/g, "")


2

이것은 내 오래된 게시물이며 허용되는 답변이 대부분 좋습니다. 그러나 나는 각 솔루션과 다른 분명한 솔루션을 벤치마킹하기로 결정했습니다 (재미를 위해). 다른 크기의 문자열을 가진 다른 브라우저의 정규식 패턴 사이에 차이가 있는지 궁금합니다.

그래서 기본적으로 나는 jsPerf 를 사용 했습니다 .

  • Chrome 65.0.3325 / Windows 10 0.0.0에서 테스트
  • Edge 16.16299.0 / Windows 10 0.0.0에서 테스트

내가 테스트 한 정규식 패턴은

  • /[\W_]+/g
  • /[^a-z0-9]+/gi
  • /[^a-zA-Z0-9]+/g

임의의 문자열 길이로로드했습니다.

  • 길이 5000
  • 길이 1000
  • 길이 200

내가 사용한 자바 스크립트 예제 var newstr = str.replace(/[\W_]+/g," ");

각 실행은 각 정규 표현식에서 50 개 이상의 샘플로 구성되어 있으며 각 브라우저에서 5 번 실행됩니다.

우리 말을 경주합시다!

결과

                                Chrome                  Edge
Chars   Pattern                 Ops/Sec     Deviation   Op/Sec      Deviation
------------------------------------------------------------------------
5,000   /[\W_]+/g                19,977.80  1.09         10,820.40  1.32
5,000   /[^a-z0-9]+/gi           19,901.60  1.49         10,902.00  1.20
5,000   /[^a-zA-Z0-9]+/g         19,559.40  1.96         10,916.80  1.13
------------------------------------------------------------------------
1,000   /[\W_]+/g                96,239.00  1.65         52,358.80  1.41
1,000   /[^a-z0-9]+/gi           97,584.40  1.18         52,105.00  1.60
1,000   /[^a-zA-Z0-9]+/g         96,965.80  1.10         51,864.60  1.76
------------------------------------------------------------------------
  200   /[\W_]+/g               480,318.60  1.70        261,030.40  1.80
  200   /[^a-z0-9]+/gi          476,177.80  2.01        261,751.60  1.96
  200   /[^a-zA-Z0-9]+/g        486,423.00  0.80        258,774.20  2.15

사실 두 브라우저의 Regex (편차를 고려한)는 거의 구별 할 수 없지만, 더 많은 시간이 걸리면 결과가 조금 더 명확해질 것입니다 (그러나 많이는 아닙니다).

1 문자의 이론적 스케일링

                            Chrome                        Edge
Chars   Pattern             Ops/Sec     Scaled            Op/Sec    Scaled
------------------------------------------------------------------------
5,000   /[\W_]+/g            19,977.80  99,889,000       10,820.40  54,102,000
5,000   /[^a-z0-9]+/gi       19,901.60  99,508,000       10,902.00  54,510,000
5,000   /[^a-zA-Z0-9]+/g     19,559.40  97,797,000       10,916.80  54,584,000
------------------------------------------------------------------------

1,000   /[\W_]+/g            96,239.00  96,239,000       52,358.80  52,358,800
1,000   /[^a-z0-9]+/gi       97,584.40  97,584,400       52,105.00  52,105,000
1,000   /[^a-zA-Z0-9]+/g     96,965.80  96,965,800       51,864.60  51,864,600
------------------------------------------------------------------------

  200   /[\W_]+/g           480,318.60  96,063,720      261,030.40  52,206,080
  200   /[^a-z0-9]+/gi      476,177.80  95,235,560      261,751.60  52,350,320
  200   /[^a-zA-Z0-9]+/g    486,423.00  97,284,600      258,774.20  51,754,840

나는 이것이 실제로 큰 차이가 아니기 때문에이 결과에 많이 관여하지 않을 것입니다. 우리가 실제로 알 수있는 것은 가장자리가 느립니다 : o. 또한 나는 지루했다.

어쨌든 자신에 대한 벤치 마크를 실행할 수 있습니다.

여기 Jsperf 벤치 마크


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.