Pièce 1 , pièce 2 , je suppose que vous n'aurez pas de mal à vous souvenir d'autres exemples.
La chose est la suivante: s'il y a plus d'une façon de résoudre un problème, le programmeur PHP (je parcours généralement la balise PHP sur StackOverflow) demandera de l'aide sur la solution impliquant des expressions régulières.
Même quand cela sera moins économique, même lorsque le manuel php suggère ( lien ) d'utiliser à la str_replace
place de any preg_*
ou de ereg_*
fonctionner quand aucune règle de substitution sophistiquée n'est requise.
Quelqu'un sait-il pourquoi cela se produit?
Ne vous méprenez pas, certains de mes meilleurs amis sont des expressions régulières et je ne méprise pas Perl. Ce que je ne comprends pas, c'est pourquoi il n'y a aucune recherche d'alternatives, même lorsque la surpuissance est évidente (regex pour changer de chaîne) ou que la complexité du code augmente de façon exponentielle (regex pour obtenir des données html en PHP )
la source
Réponses:
Parce qu'au niveau subconscient, ils se sentent comme un programme intelligent complet qui peut accomplir beaucoup de choses de son propre chef tout en étant englobant et auto-adaptatif (schémas de réflexion).
C'est pourquoi les gens croient immédiatement que les expressions régulières résoudront n'importe quelle tâche basée sur du texte, ne pensant pas que cela pourrait être excessif et ne réalisant pas que cela pourrait me sous-estimer (analyser les langues avec).
Une toute petite chose contenant du pouvoir magique. Vous ne pouvez pas dire non, n'est-ce pas?
la source
Lorsque le seul outil dont vous disposez est une expression régulière, chaque problème ressemble à
^((?>[a-zA-Z\d!#$%&'*+\-/=?^_{|}~]+\x20*|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*"\x20*)*(?<angle><))?((?!\.)(?>\.?[a-zA-Z\d!#$%&'*+\-/=?^_{|}~]+)+|"((?=[\x01-\x7f])[^"\\]|\\[\x01-\x7f])*")@(((?!-)[a-zA-Z\d\-]+(?<!-)\.)+[a-zA-Z]{2,}|\[(((?(?<!\[)\.)(25[0-5]|2[0-4]\d|[01]?\d?\d)){4}|[a-zA-Z\d\-]*[a-zA-Z\d]:((?=[\x01-\x7f])[^\\\[\]]|\\[\x01-\x7f])+)\])(?(angle)>)$
la source
Je pense que c'est parce que:
la source
Dans les phases précédentes de ma carrière (c'est-à-dire pré-PHP), j'étais un gourou de Perl, et un aspect majeur de Perl gurudom est la maîtrise des expressions régulières.
Dans mon équipe actuelle, je suis littéralement le seul d'entre nous à atteindre l'expression régulière avant d'autres outils (généralement plus méchants). On dirait que pour le reste de l'équipe, c'est de la pure magie. Ils se dirigeront vers mon bureau et demanderont une expression régulière qui me prendra littéralement dix secondes à assembler, puis seront époustouflés quand cela fonctionnera. Je ne sais pas - j'ai travaillé avec eux si longtemps, c'est tout simplement naturel à ce stade.
En l'absence de fluidité regex, vous vous retrouvez avec des combinaisons d'instructions de contrôle de flux enveloppant les instructions strstr et strpos, ce qui devient laid et difficile à exécuter dans votre tête. Je préfère de loin créer une regex élégante que trente lignes de recherche de chaînes.
la source
Au contraire. Les gens parroient les regex sont trop souvent des mèmes maléfiques de l' OMI. Il est évident que preg_match est surutilisé
php
, mais il est moins évident qu'il est souvent judicieux de le faire (en PHP).J'irais si loin et conjecturerais que c'est encore une autre microoptimisation en php land pour utiliser les fonctions de chaîne. Il y en a beaucoup et beaucoup utiles, et ils sont généralement le meilleur choix. Mais vous ne devriez pas fuir
preg_match
en faveur de multiplesstrpos
et deif
chaînes. Parce qu'en pratique, il s'avère que libpcre est souvent plus rapide que PHP ne peut exécuter une boucle à la recherche d'alternatives de chaînes, par exempleComme un exemple récent m'a fait réaliser, tester si une chaîne est tout en minuscules:
Est plus lisible que:
Et vous supposeriez que le premier doit être plus rapide, car il est entièrement en PHP. Mais en réalité, l'expression régulière ne regarde la chaîne qu'une seule fois et peut annuler la condition annulée dès qu'elle trouve une lettre majuscule. L'approche strtolower () examine cependant la chaîne deux fois. Le premier strtolower () crée une chaîne en double en itérant sur chaque lettre, en la comparant et en la mettant en majuscule. Ensuite, l'
==
itération sur l'original et la copie à nouveau, en les comparant une fois de plus.Ce n'est donc pas un cas évident. Et pour être objectif, le premier est souvent plus rapide, car vous ne comparez normalement que des chaînes courtes. Mais il est impératif de ne pas aller aveuglément en supposant que les fonctions de chaîne PHP sont toujours recommandées par rapport aux expressions régulières.
(Je suis tenté d'ajouter une autre diatribe au sujet de la réponse amusante de @ bobince concernant les xhtml-regexes, et comment elle est récemment souvent liée de manière très inutile. Et les réponses plus objectives ci-dessous sont ignorées.)
la source
/x
mode pour laisser de l'espace pour le coude de la segmentation cognitive et pour des commentaires expliquant pourquoi les choses se font, devrait bien sûr avoir les oreilles fermées. Mais pour de véritables expressions rationnelles d'une complexité raisonnable, vous devez envisager d'appliquer une conception descendante via des expressions rationnelles grammaticales . Une fois que vous aurez vu la lumière, vous n'y retournerez plus jamais/@#$^^@#$^&&*)@#/
.Les expressions régulières sont très attrayantes car elles sont le meilleur outil pour analyser une langue régulière.
Ils présentent les avantages suivants:
N
en temps O (N
).Cela les rend attrayants pour les situations auxquelles ils sont adaptés, mais les gens peuvent les utiliser dans des contextes où ils ne sont pas le meilleur outil, car ils:
la source
vi
, vous pariez votre vie que j'utilise:%s/foo/bar/gc
dessus. Si c'est assez bon pour un éditeur, c'est assez bon pour un script.Hmmm, je ne peux que deviner. Peut-être que certaines personnes ont expérimenté que 30 lignes de leur code ont été remplacées par une expression régulière de 20 caractères, il leur semble donc mal d'utiliser autre chose lorsque des expressions régulières peuvent être utilisées.
la source
Cela correspond à la façon dont certaines personnes pensent. Je ne les aime pas, mais j'ai des amis qui semblent penser aux regexps. Je suppose que la partie correspondant au motif de leur cerveau est plus exposée que la logique formelle. :-)
la source
Je pense que l'omniprésence de l'expression régulière est due à l'ubiquité des chaînes. La chaîne est la structure de données la plus simple, la première que la plupart d'entre nous apprennent. Puisque tout notre code est écrit sous forme symbolique, il est naturel pour un programmeur d'envisager de modéliser quelque chose sous forme symbolique. Mais si notre langage de programmation offre une résistance lorsque nous essayons d'étendre sa syntaxe pour nos nouvelles formes symboliques intelligentes, elles se retrouvent toutes entre guillemets. Le modèle de données relationnel dispose de SQL. Le modèle de données XML a XQuery. Mais qu'en est-il du modeste modèle de données de chaîne? Regex!
Pas plus tard qu'hier, je cherchais dans l'API un nouveau cadre Javascript brillant qui prend en charge le développement de jeux HTML5. Il dispose d'un mécanisme déclaratif pour décrire les principaux sous-systèmes dont votre jeu aurait besoin. Comment spécifie-t-on ces fonctionnalités? JSON? Notation courante des points? Un tableau? Non - une chaîne contenant une liste de noms d'entités séparés par des virgules et des espaces. Je me demande comment il analyse cette liste ...?
la source
Parce que vous pouvez tout voir en même temps. En étant capable de voir le tout, il peut être plus facile de travailler avec, et c'est toujours agréable. C'est un peu comme la raison pour laquelle de nombreux programmeurs C ++ utilisent toujours des instructions de type printf: ce n'est pas sûr pour les types (bien que gcc puisse au moins vérifier les types sur les instructions printf), et ce n'est pas joli, mais boy est-il compact et utilisable.
Si c'est une expression assez simple, alors ils SONT souvent la meilleure façon de faire les choses - leur forme compacte et leurs nombreuses capacités les rendent parfaits pour certaines tâches. Le problème survient lorsque vous rendez la regex si compliquée que vous ne pouvez plus la lire, ou lorsque vous utilisez une regex complexe pour faire quelque chose qui pourrait être fait plus rapidement via de simples opérations de chaîne.
Regex, comme tout autre outil puissant, doit être utilisé avec modération appropriée - ni trop, ni trop peu. Et à moins que les performances ne soient un gros problème, une seule expression régulière peut parfois être plus rapide à écrire et plus facile à déboguer qu'une série d'opérations de chaîne.
la source
Hmm, les réponses actuelles sont trop centrées sur les aspects techniques et les avantages / inconvénients de lisibilité (ce qui est un point important). Alors permettez-moi d'essayer de le déplacer un peu plus sur l'environnement / la communauté PHP:
Mais c'est juste comme notes secondaires. Je crois que c'est de toute façon principalement des raisons de perception et techniques qui conduisent à une surutilisation et / ou à une élimination des expressions régulières en général. Pourtant, PHP et sa base d'utilisateurs ont quelques propriétés qui le composent, et pourquoi nous voyons plus de questions sur SO à ce sujet [citation nécessaire!] Et ils sont "morbidement attractifs" là-bas.
la source
J'aime les expressions régulières en général, je les trouve plus faciles à lire / à comprendre que les 20 lignes de code avec lesquelles je devrais les remplacer. Les expressions régulières courtes sont rapidement lues et comprises et elles sont relativement faciles à maintenir (si l'expression change, vous n'avez qu'une seule ligne à changer par rapport à la recherche à travers les 20 lignes de code pour effectuer le changement). Il y a des moments où ils sont mal utilisés, mais il en est de même de bien d'autres choses.
La raison pour laquelle vous voyez probablement autant d'abus est parce que vous parcourez la section PHP de StackOverFlow car je suis sûr que vous savez qu'il y a beaucoup de programmeurs PHP immatures umm là-bas.
la source
Pourquoi les expressions régulières sont-elles si morbides?
Ils ne sont pas. Ils sont vraiment laids comme l'enfer. Et incompréhensible. C'est une abomination qui devrait être tuée dès que possible.
Maintenant, cela étant dit, je reviens au débogage d'une petite application Perl. Je ne peux pas m'en empêcher; malheureusement, ils sont parfois le meilleur outil pour le travail.
la source
L'homme est une créature utilisatrice d'outils, et les expressions régulières sont des outils puissants. Une belle métaphore pour les expressions régulières est une trancheuse à viande d'une charcuterie. Si vous voulez des tranches de dinde, du corned-beef, etc., comme du papier, c'est juste la chose. Cependant, vous avez besoin de mains qualifiées pour l'utiliser, car vous pouvez vous couper très mal avec lui et vous ne sentirez rien avant de voir le sang. Ce que je veux dire par là, c'est que le gros problème avec les expressions régulières est de les retirer légèrement signifie que vous faites correspondre quelque chose que vous ne devriez pas, ou vice versa, et vous ne le découvrez pas jusqu'à ce que cela cause un problème plus loin dans le processus.
la source
Les expressions régulières sont très attrayantes car elles détiennent du pouvoir. Vous pouvez faire un travail très compliqué en très peu de caractères.
Le problème est que la construction d'expression régulière standard est pas Turing-complet qui signifie qu'il ya des programmes que vous ne pouvez pas mettre en œuvre avec une expression régulière, et les gens ne SAIS que quand ils sont attirés par la puissance apparente des expressions régulières.
C'est - je suppose - la raison de la citation jwz de "maintenant ils ont deux problèmes".
Je suppose que les expressions régulières de Perl sont complètes de Turing, mais apparemment, cela n'a pas encore été prouvé ou réfuté de manière décisive.
la source
Parce que c'est un moyen efficace de programmer une machine à états finis, qui est un outil puissant lorsqu'il s'applique. C'est fondamentalement son propre langage pour programmer les FSM, ce qui est utile si vous connaissez la langue, ennuyeux si vous ne le savez pas.
la source
Dans mon expérience, les regex sont comme un art ancien, quelque chose d'obscur, certains les ressentent parce qu'ils ne peuvent pas comprendre la sorcellerie impliquée et peut-être parce que personne ne vous les expliquera. Je n'ai pas entendu parler d'universités qui leur enseignent quelque chose de moins trivial que de faire correspondre un e-mail. Ensuite, il y a le fonctionnement interne mystique de cela, puisque la plupart des gens ne les comprennent pas, ils doivent être lents . Et les faire fonctionner correctement du premier coup est toujours un défi pour les nouveaux arrivants.
La même chose peut être dite à propos de Perl, awk, Linux et tout ce qui n'a pas de boutons brillants ou une belle syntaxe colorée. Donc, c'est comme une complexité supplémentaire pour les "tâches triviales", il suffit de lancer des boucles, des divisions, un interrupteur, de la magie et c'est tout, quelque chose qui pourrait fonctionner. Mais bon, si vous êtes de l'autre côté de la route, les regex sont de magnifiques emporte-pièces qui ressemblent à du bruit de signal sans boucles désagréables ou plus de choses à déboguer. Je les aime aussi pour la flexibilité qu'ils offrent. Lorsque le modèle pour correspondre change, vous changez simplement l'expression régulière, pas l'algorithme, ou l'outil / quoi que ce soit, et c'est agréable et fonctionne à nouveau. Et comme il s'agit d'une chaîne magique, vous pouvez la mettre en dehors du code source si vous le souhaitez. Et une autre chose qui me fait penser à Perl, si vous écrivez un regex de plus de 20 caractères, il vous semble que vous avez accompli beaucoup, au moins pour moi, c'est tellement soigné et compact. Je suis aussi un programmeur paresseux, je n'aime pas écrire beaucoup de code avec une belle identification et des commentaires et ajouter quelques bugs au mix.
la source