8
votes

Quand utiliser les méthodes de chaîne intégrées Regex vs?

J'ai remarqué beaucoup de petits débats sur quand utiliser regex et quand utiliser une fonction de chaîne intégrée comme chaîne.replace () (.NET).

Il semble que beaucoup de gens recommandent toujours, toujours, toujours à l'aide de regex chaque fois que vous traitez de chaînes du tout (en plus de les afficher). Est-ce vraiment la meilleure pratique ou juste une mauvaise impression de ma part? On dirait que la surkilleuse utilise Regex lorsque le problème est simplement "supprimer toute apparition de l'un de ces mots de ce texte".

J'aimerais avoir une contribution afin que je puisse améliorer mon propre code et mieux répondre aux questions des autres sur la manipulation des chaînes (il y en a beaucoup).


2 commentaires

Cette question a été posée il y a environ une semaine: Stackoverflow.com/Questtions/1038186/...


@Streetpc: Merci pour la liaison. J'étais sûr que je l'ai vu il y a un moment, je ne pouvais tout simplement pas le trouver.


6 Réponses :


10
votes

Je pense que c'est une mauvaise impression d'utiliser regex comme solution de capture - toutes les recherches à base de cordes lorsque la recherche / remplacement est possible.

Regex est instructionnellement un processus de correspondance de motif et doit être utilisé lorsque les types de chaînes que vous souhaitez faire correspondre sont variable ou ne sont que conformes à un motif particulier. Pour les cas où une simple recherche de chaînes suffirait, je recommanderais toujours d'utiliser les méthodes intégrées de la catégorie de chaîne

Je n'ai jamais vu de statistiques de performance suggérant qu'une recherche basée sur la regex est plus rapide ou plus performante que l'indexation des chaînes. De plus, les moteurs Regex varient dans leurs capacités d'exécution.

Comme si cela ne suffisait pas, il est assez facile de construire une regex qui fonctionne assez mal (utilise beaucoup de backtracking, par exemple) une connaissance approfondie de regex est nécessaire si vous souhaitez vraiment optimiser les performances à l'aide de la correspondance de RegEx. D'autre part, il est assez simple, même pour un N00B d'effectuer des recherches ou des remplaçants à base de chaînes.


2 commentaires

C'est ce que je pensais aussi. Il semble toujours que pour chaque réponse basée sur une chaîne, il y a 5 réponses de regex.


Vous voulez dire, sur Stackoverflow? Cela peut être parce que les gens ont tendance à ne poser que des questions liées à la chaîne non évidentes et à résoudre le reste eux-mêmes. Les problèmes de type non évidents nécessitent souvent une solution de regex. Pourtant, cela ne devrait pas être considéré comme une représentation générique des avantages et des inconvénients des deux méthodes. :-)



0
votes

J'aurais tendance à penser que s'il existe une fonction dédiée pour manipuler une chaîne comme vous le souhaitez dans le cadre de la classe de cordes, il devrait être assez proche de «bon» lorsque la regex est à effet général.

Mais comme avec quelque chose de subjectif, si vous êtes préoccupé par le temps de performance, les différentes méthodes.

Ensuite, faites à nouveau ce qui est le plus facile à comprendre et effectuez une surveillance de la performance pour trouver le véritable cou de bouteille que vous allez.


0 commentaires

2
votes

Regex.replace () est beaucoup plus cher que la méthode String.replace (). Utilisez string.replace () dans la mesure du possible, et utilisez regex quand c'est une nécessité.

Jetez un coup d'œil à ce Benchmark Pour voir les différences de temps.


0 commentaires

2
votes

J'adore les regexes, mais s'il y a un simple xxx-> remplacer ("FOO", "bar") Type fonction de type disponible Il semble idiot d'utiliser un outil d'alimentation comme RegEx lorsqu'un simple tournevis.

Si la performance est un problème, RegEx peut être très cpu consommer pour des substitutions simples. (Regex travaille généralement plus efficace sur une recherche / une transformation complexe qu'une série d'appels «simples»).

Aussi, je suis toujours surpris par les différences de mise en œuvre "mineures" - comme les pythons impliqués "^ ... $" sur le match () intégré. J'étais sur la route sans accès Internet à l'époque et j'ai fini par acheter une autre copie du livre de Lutz pour découvrir ce qui se passait!


1 commentaires

Les outils électriques sont amusants, jusqu'à ce que vous clouiez votre main sur le mur avec le pistolet à ongles



1
votes

Évidemment, pour des opérations de recherche / match / remplacement complexes, les expulsions sont la voie à suivre. Pour des trucs simples, comme le remplacement d'un mot unique par un autre mot, des méthodes de chaîne normales sont préférées.

Mais dans de nombreux cas, ce n'est pas si simple. Parfois, vous rencontrez une situation où vous pourriez utiliser des opérations de chaîne standard, tandis que la solution de regex est plus élégante. Même si l'algorithme de cordes de vanille est 10 fois plus rapide, c'est toujours une bonne idée de vous demander si cela compte dans cette pièce de code particulier (par exemple, si le code n'est pas exécuté dans une boucle).

Je préférerais la lisibilité d'une simple opération de regex sur un algorithme plus complexe, mais plus rapide utilisant des opérations de chaîne pure.

juste mes 2 cents ...


0 commentaires

0
votes

La méthode de remplacement de chaîne intégrée est plus rapide que la regex lorsque vous souhaitez remplacer les sous-chaînes. Voici les numéros de référence à Golang, j'ai essayé de remplacer 3 sous-chaînes de type.

Benchmark remplacer 2 --- 236 NS / OP

Benchmark Remplacez 5 --- 249 NS / OP

Benchmark remplacer 10 --- 871 NS / OP

Benchmark Regexp 2 --- 3750 NS / OP

Benchmark Regexp 5 --- 4457 NS / OP

Benchmark Regexp 10 --- 6020 NS / OP

Comme vous pouvez le voir, le remplacement est bien meilleur que REGEXP si vous remplacez des sous-chaînes connues. Mais si vous devez faire correspondre des chaînes ou des modèles inconnus, alors la Regexp pourrait être meilleure.


0 commentaires