Ersetzen Sie alle nicht alphanumerischen Zeichen, neuen Linien und mehrere Leerzeichen durch ein Leerzeichen

134

Ich suche nach einer netten RegEx- Lösung, die ich ersetzen kann

  • Alle nicht alphanumerischen Zeichen
  • Alle NewLines
  • Alle mehrfachen Instanzen von Leerzeichen

Mit einem einzigen Leerzeichen


Für diejenigen, die zu Hause spielen ( das Folgende funktioniert )

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

Meiner Meinung nach ist RegEx wahrscheinlich stark genug, um dies in einer Aussage zu erreichen. Die Komponenten, von denen ich denke, dass sie benötigt werden, sind

  • [^a-z0-9] - um nicht alphanumerische Zeichen zu entfernen
  • \s+ - mit allen Sammlungen von Räumen übereinstimmen
  • \r?\n|\r - Alle neuen Zeilen abgleichen
  • /gmi - global, mehrzeilig, ohne Berücksichtigung der Groß- und Kleinschreibung

Allerdings kann ich den Regex nicht richtig stylen ( das Folgende funktioniert nicht )

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


Eingang

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


Gewünschte Ausgabe

234 Me 2 2013 1080p x264 5 1 BluRay S01 asd 05 S1E5 1x05 1x5
Die allgemeine
quelle
Wie genau funktioniert Ihr Versuch nicht? Was geht schief
Pointy

Antworten:

233

Seien Sie sich bewusst, dass \W der Unterstrich bleibt . Ein kurzes Äquivalent für [^a-zA-Z0-9]wäre[\W_]

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

\Wist die Negation der Abkürzung \w für [A-Za-z0-9_]Wortzeichen (einschließlich des Unterstrichs)

Beispiel bei regex101.com

Jonny 5
quelle
Überprüfen Sie es und testen Sie es, haben Sie noch nicht viel Erfahrung in js-regex: p Glücklich, dass es Ihnen gefällt
Jonny 5
6
Beachten Sie, dass \Wauch nicht-lateinische Zeichen als Nicht-Wort-Zeichen erkannt werden.
Tyblitz
1
Ich habe diese Antwort nach all den Jahren als richtig markiert, weil ich zurückblickte und die akzeptierten Unterstriche nicht ausschlossen
TheGeneral
143

Jonny 5 hat mich geschlagen. Ich würde vorschlagen, das \W+ohne das \swie in zu verwenden text.replace(/\W+/g, " "). Dies gilt auch für Leerzeichen.

T-CatSan
quelle
Vielen Dank an T-CatSan für den Hinweis! Verbessert, und Saruman, du kannst die beste Antwort auf alles ändern :-) Aber es sollte \W+nicht alles Gute für ein gutes [W+]neues Jahr sein!
Jonny 5
Danke, @ Jonny5! Ich habe die von Ihnen vorgeschlagene Änderung vorgenommen. Ich hatte vorher mit den Klammern getestet und jetzt sehe ich, dass es ohne sie funktioniert. Dir auch ein frohes neues Jahr.
T-CatSan
1
hey @ T-CatSan gibt es eine Möglichkeit, Ausnahmen hinzuzufügen? Ich möchte Charaktere behalten &und -. Irgendwelche Tipps?
Renato Gama
1
Ich habe die folgende Änderung / (\ W +) | (_) / g vorgenommen, um _ ebenfalls zu ignorieren. Aber ich frage mich nur, warum es im ersten Modell nicht ignoriert wird und mein Regex das effizienteste ist.
Sridhar Gudimela
14

Da [^a-z0-9]die Zeichenklasse alles enthält, was nicht Alnum ist, enthält sie auch weiße Zeichen!

 text.replace(/[^a-z0-9]+/gi, " ");
Casimir et Hippolyte
quelle
6

Nun, ich denke, Sie müssen jedem Muster nur einen Quantifizierer hinzufügen. Auch die Wagenrücklaufsache ist ein bisschen lustig:

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

bearbeiten Das \sDing passt \rund \nauch.

Spitze
quelle
Ja, da war ein bisschen Dummkopf drin, der aus anderen Antworten zu diesem Thema hervorgegangen ist, aber das funktioniert großartig, danke!
TheGeneral
2

A sah einen anderen Beitrag, der auch diakritische Zeichen hatte, was großartig ist

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

Dmitri R117
quelle
2

Dies ist ein alter Beitrag von mir, die akzeptierten Antworten sind größtenteils gut. Ich entschied mich jedoch, jede Lösung und eine andere offensichtliche zu vergleichen (nur zum Spaß). Ich fragte mich, ob es einen Unterschied zwischen den Regex-Mustern in verschiedenen Browsern mit unterschiedlich großen Zeichenfolgen gab.

Also im Grunde verwendet i jsPerf auf

  • Testen in Chrome 65.0.3325 / Windows 10 0.0.0
  • Testen in Edge 16.16299.0 / Windows 10 0.0.0

Die Regex-Muster, die ich getestet habe, waren

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

Ich habe sie mit einer Stringlänge von zufälligen Zeichen geladen

  • Länge 5000
  • Länge 1000
  • Länge 200

Beispiel Javascript, das ich verwendet habe var newstr = str.replace(/[\W_]+/g," ");

Jeder Lauf bestand aus 50 oder mehr Beispielen auf jeder Regex, und ich habe sie 5 Mal in jedem Browser ausgeführt.

Lass uns unsere Pferde rennen!

Ergebnisse

                                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

Um ehrlich zu sein, Regex in beiden Browsern (unter Berücksichtigung der Abweichung) war fast nicht zu unterscheiden, aber ich denke, wenn es noch öfter ausgeführt wird, werden die Ergebnisse etwas klarer (aber nicht viel).

Theoretische Skalierung für 1 Zeichen

                            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

Ich würde nicht zu viel auf diese Ergebnisse eingehen, da dies keine signifikanten Unterschiede sind. Wir können nur sagen, dass die Kante langsamer ist: o. Außerdem war ich super gelangweilt.

Auf jeden Fall können Sie den Benchmark für sich selbst durchführen.

Jsperf Benchmark hier

Die allgemeine
quelle
0

Gehen Sie wie folgt vor, um durch Bindestriche zu ersetzen:

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