Je cherche une solution soignée RegEx à remplacer
Avec un seul espace
Pour ceux qui jouent à la maison (ce qui suit fonctionne)
text.replace(/[^a-z0-9]/gmi, " ").replace(/\s+/g, " ");
Ma pensée est que RegEx est probablement assez puissant pour y parvenir en une seule déclaration. Les composants dont je pense avoir besoin sont
[^a-z0-9]
- Supprimer les caractères non alphanumériques\s+
- correspond à n'importe quelle collection d'espaces\r?\n|\r
- correspond à toutes les nouvelles lignes/gmi
- global, multiligne, insensible à la casseCependant, je ne peux pas sembler styler l'expression rationnelle de la bonne manière (ce qui suit ne fonctionne pas)
text.replace(/[^a-z0-9]|\s+|\r?\n|\r/gmi, " ");
Entrée
234&^%,Me,2 2013 1080p x264 5 1 BluRay
S01(*&asd 05
S1E5
1x05
1x5
sortie souhaitée
234 Me 2 2013 1080p x264 5 1 BluRay S01 asd 05 S1E5 1x05 1x5
Sachez que \W
laisse le trait de soulignement . Un court équivalent pour [^a-zA-Z0-9]
serait [\W_]
text.replace(/[\W_]+/g," ");
\W
est la négation de raccourci\w
pour [A-Za-z0-9_]
caractères Word (y compris le trait de soulignement)
Jonny 5 m'a battu à cela. J'allais suggérer d'utiliser le \W+
sans le \s
comme dans text.replace(/\W+/g, " ")
. Cela couvre également les espaces blancs.
Puisque la classe de caractères [^a-z0-9]
contient tout ce qui n'est pas alnum, elle contient aussi des caractères blancs!
text.replace(/[^a-z0-9]+/gi, " ");
Eh bien, je pense que vous avez juste besoin d’ajouter un quantificateur à chaque motif. De plus, le retour du chariot est un peu drôle:
text.replace(/[^a-z0-9]+|\s+/gmi, " ");
edit La chose \s
correspond à \r
et \n
aussi.
A vu un autre poste qui portait aussi des signes diacritiques, ce qui est excellent
s.replace(/[^a-zA-Z0-9À-ž\s]/g, "")
C'est un de mes vieux messages, les réponses acceptées sont bonnes pour la plupart. Cependant, j'ai décidé de comparer chaque solution et une autre solution évidente (juste pour le plaisir). Je me demandais s'il y avait une différence entre les motifs de regex sur différents navigateurs avec des chaînes de tailles différentes.
Donc, fondamentalement, j'ai utilisé jsPerf sur
Les modèles de regex que j'ai testés étaient
/[\W_]+/g
/[^a-z0-9]+/gi
/[^a-zA-Z0-9]+/g
Je les ai chargés avec une longueur de chaîne de caractères aléatoires
Exemple javascript j’ai utilisé var newstr = str.replace(/[\W_]+/g," ");
Chaque run consistait en 50 échantillons ou plus sur chaque regex, et je les ai exécutés 5 fois sur chaque navigateur.
Permet de faire la course avec nos chevaux!
Résultats
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
À vrai dire, les expressions rationnelles dans les deux navigateurs (en tenant compte de la déviation) étaient presque indiscernables, mais je pense que si cela fonctionnait encore plus souvent, les résultats deviendraient un peu plus clairs (mais pas de beaucoup).
Mise à l'échelle théorique pour 1 caractère
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
Je ne prendrais pas trop ces résultats car ce n’est pas vraiment une différence significative, tout ce que nous pouvons dire, c’est Edge est plus lent: o. En plus, je m'ennuyais super.
Quoi qu'il en soit, vous pouvez exécuter la référence pour vous-même.