programing

영숫자가 아닌 모든 문자, 새 줄 및 여러 공백을 하나의 공백으로 바꾸기

css3 2023. 7. 24. 22:43

영숫자가 아닌 모든 문자, 새 줄 및 여러 공백을 하나의 공백으로 바꾸기

대체할 깔끔한 정규식 솔루션을 찾고 있습니다.

  • 영숫자가 아닌 모든 문자
  • 모든 새 줄
  • 공백의 모든 다중 인스턴스

하나의 공간으로


집에서 노는 사람들을 위해 (다음이 작동합니다)

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

생각에는 정규식은 아마도 한 진술에서 이를 달성할 수 있을 정도로 강력할 것이라고 생각합니다.내가 필요하다고 생각하는 구성 요소는

  • [^a-z0-9]가 아닌 문자를
  • \s+의 공백 합니다.
  • \r?\n|\r new line 과일치모인라일치▁match모
  • /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

알아두시기 바랍니다.\W 밑줄을 남깁니다.에 해당하는 약어[^a-zA-Z0-9]되요지일 입니다.[\W_]

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

\W속기의 부정입니다. \w위해서[A-Za-z0-9_] 문자는 (으)로 표시됩니다.

예: regex101.com

조니 5가 저를 이겼습니다.저는 그것을 사용하는 것을 제안하려고 했습니다.\W+ 없이\s에 있어서와 같이text.replace(/\W+/g, " ")여기에는 흰색 공간도 포함됩니다.

때부터[^a-z0-9]문자 클래스에는 숫자가 아닌 모든 문자가 포함되어 있습니다. 흰색 문자도 포함되어 있습니다.

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

저는 당신이 각각의 패턴에 정량자를 추가하기만 하면 된다고 생각합니다.또한 마차를 반납하는 것은 약간 재미있습니다.

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

편집\s하는 것\r그리고.\n도 마찬가지야

갱신하다

브라우저 환경은 빠르게 변화하며, 이러한 벤치마크는 안타깝게도 시대에 뒤떨어지며, 이 문서를 읽을 때 오해의 소지가 있습니다.


이것은 저의 오래된 게시물입니다, 다른 답변들은 대부분 좋습니다.하지만 저는 각 솔루션과 또 다른 분명한 솔루션을 (재미삼아) 벤치마킹하기로 결정했습니다.저는 크기가 다른 문자열을 가진 브라우저마다 정규식 패턴에 차이가 있는지 궁금합니다.

그래서 기본적으로 jsPerfon을 사용했습니다.

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

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

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

무작위로 문자열 길이를 입력했습니다.

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

I 사용한 javascript 가내한javascript 제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 벤치마크 여기

유니코드가 사용될 때

text.replace(/[^\p{L}\p{N}]+/gu," ");

설명.

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  [^\p{L}\p{N}]+           Any character except Unicode letters and digits
                           (1 or more times (matching the most amount possible))

JavaScript 코드 조각:

const text = `234&^%,Me,2 2013 1080p x264 5 1 BluRąy
S01(*&aśd 05
S1E5
1x05
1x5`
console.log(text.replace(/[^\p{L}\p{N}]+/gu, ` `))

A는 분음 부호가 있는 다른 게시물을 보았고, 그것은 훌륭합니다.

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

대시로 대체하려면 다음을 수행합니다.

text.replace(/[\W_-]/g,' ');

위의 전문가 답변 이후에도 여전히 어려움을 겪고 있는 사람(나처럼...)을 위해 Visual Studio 2019에서 이 작업이 가능합니다.

outputString = Regex.Replace(inputString, @"\W", "_");

추가하는 것을 기억하십시오.

using System.Text.RegularExpressions;
const processStirng = (str) => (
    str
    .replace(/[^a-z0-9\s]/gi, '') // remove all but alpha-numeric and spaces
    .replace(/ +/g, ' '); // remove duplicated spaces
);
processSting(' $ your    string    here #');

언급URL : https://stackoverflow.com/questions/20864893/replace-all-non-alphanumeric-characters-new-lines-and-multiple-white-space-wit