web-dev-qa-db-fra.com

Expression régulière vs. Analyse de chaîne

Au risque d'ouvrir une boîte de vers et d'obtenir des votes négatifs, je me retrouve à demander,

Quand dois-je utiliser des expressions régulières et quand est-il plus approprié d'utiliser l'analyse de chaîne?

Et je vais avoir besoin d'exemples et de raisonnement quant à votre position . J'aimerais que vous abordiez des choses comme la lisibilité , la maintenabilité , mise à l'échelle , et surtout performances dans votre réponse.

J'ai trouvé une autre question ici qui n'avait qu'une seule réponse qui a même pris la peine de donner un exemple. J'ai besoin de plus pour comprendre cela.

Je joue actuellement en C++ mais les expressions régulières sont dans presque tous les langages de niveau supérieur et j'aimerais savoir comment différents langages utilisent/gèrent également les expressions régulières, mais c'est plus une réflexion après coup.

Merci pour l'aide à la comprendre!

Edit: Je suis toujours à la recherche d'autres exemples et j'en parle, mais la réponse jusqu'à présent a été excellente. :)

34
Dan

Cela dépend de la complexité du langage avec lequel vous traitez.

Scission

C'est très bien quand cela fonctionne, mais ne fonctionne que lorsqu'il n'y a aucune convention d'échappement . Cela ne fonctionne pas pour CSV par exemple, car les virgules à l'intérieur des chaînes entre guillemets ne sont pas des points de partage appropriés.

foo, bar, baz

peut être divisé, mais

foo, "bar, baz"

ne peux pas.

Régulier

Les expressions régulières sont idéales pour les langages simples qui ont un "grammaire régulière" . Les expressions régulières de Perl 5 sont un peu plus puissantes en raison des références arrières, mais la règle générale est la suivante:

Si vous devez faire correspondre les parenthèses ((...), [...]) ou d'autres imbrication comme les balises HTML, alors les expressions régulières en elles-mêmes ne sont pas suffisantes.

Vous pouvez utiliser des expressions régulières pour diviser une chaîne en un nombre connu de morceaux - par exemple, extraire le mois/jour/année d'une date. Cependant, ce n'est pas le bon travail pour analyser des expressions arithmétiques complexes.

Évidemment, si vous écrivez une expression régulière, que vous vous éloignez pour une tasse de café, que vous revenez et que vous ne comprenez pas facilement ce que vous venez d'écrire, alors vous devriez chercher un moyen plus clair d'exprimer ce que vous faites. Les adresses e-mail sont probablement à la limite de ce que l'on peut gérer correctement et de manière lisible en utilisant des expressions régulières.

Sans contexte

Les générateurs d'analyseurs et les analyseurs pushdown/PEG codés à la main sont parfaits pour gérer les entrées plus compliquées où vous devez gérer l'imbrication afin que vous puissiez créer un arborescence ou traiter priorité de l'opérateur ou associativité.

Les analyseurs libres de contexte utilisent souvent des expressions régulières pour d'abord diviser l'entrée en morceaux (espaces, identificateurs, ponctuation, chaînes entre guillemets), puis utiliser une grammaire pour transformer ce flux de morceaux en arborescence.

La règle d'or pour les grammaires CF est

Si les expressions régulières sont insuffisantes mais que tous les mots de la langue ont la même signification indépendamment des déclarations antérieures, alors CF fonctionne.

Sans contexte

Si les mots de votre langue changent de sens selon le contexte, vous avez besoin d'une solution plus compliquée. Ce sont presque toujours des solutions codées à la main.

Par exemple, en C,

#ifdef X
  typedef int foo
#endif

foo * bar

Si foo est un type, alors foo * bar est la déclaration d'un pointeur foo nommé bar. Sinon, il s'agit d'une multiplication d'une variable nommée foo par une variable nommée bar.

32
Mike Samuel

Cela devrait être expression régulière ET analyse de chaîne ..

Vous pouvez utiliser les deux à votre avantage! Souvent, les programmeurs essaient de créer une expression régulière UNIQUE pour analyser un texte, puis trouvent cela très difficile à maintenir. Vous devez utiliser les deux au besoin.

Le moteur REGEX est RAPIDE . Une simple correspondance prend moins d'une microseconde, mais elle n'est pas recommandée pour l'analyse HTML.

8
Anirudha