2011-08-18 6 views
2

Quel est le motif regex pour un motif regex? J'utilise Ruby version 1.8.7, et j'ai besoin de déterminer si une chaîne donnée est un motif regex. Quel est le meilleur modèle à utiliser pour le déterminer?Quel est le motif regex pour un motif regex?

Merci, Anand

+0

Je ne suis pas sûr à 100%, mais je pense que cela a été demandé avant des expressions régulières Ruby. –

Répondre

6

La chaîne "cat" pourrait être compilée en un motif regex. Vous pouvez faire quelque chose comme:

def is_regex?(str) 
    Regexp.new(str) rescue false 
end 
+0

Certaines chaînes ne sont pas valides - par exemple, '/ (/' n'est pas une regex valide pour tout moteur regex où les parenthèses sont spéciales par défaut (ce qui est le cas pour la plupart d'entre elles) – Amber

+1

. new .. qui tentera une compilation sur le str ou lancera une exception si elle ne peut pas compiler et retourner false .. es-tu en train de dire que ça ne marchera pas? –

+0

C'est la seule façon sensée de faire ça :) – porges

2

Il n'y a pas un, puisque regexes eux-mêmes ne sont pas une langue régulière (à cause de choses comme entre parenthèses correspondant).

Si vous voulez déterminer si quelque chose est une regex valide, je vous recommande d'essayer de le compiler comme une regex et de voir si elle échoue. Bien, n'importe quel mot peut être un motif regex.

+0

Vous êtes très confus. Les choses que les gens appellent des expressions régulières sont parfaitement capables de faire correspondre des choses qui ne sont pas des langages réguliers, y compris des parenthèses correspondantes et autres. – tchrist

+0

Les parenthèses imbriquées ne sont pas quelque chose que la plupart des arômes regex gèrent bien. Oui, il existe des moteurs regex récursifs (tels que la référence récursive de Perl), mais ils sont vraiment un mauvais choix par rapport à l'utilisation d'un analyseur regex réel. – Amber

0

En supposant que le motif regex est une chaîne avec deux barres obliques, / définissant le motif, le regex pour trouver un motif avec deux foward barres obliques au début et à la fin d'un modèle est comme suit:

(\/(?:.)*\/(?:i|g|s|m|U)*)

+0

Cela semble assez raisonnable. Pourquoi a-t-il été déprécié? –

+0

@David: Toute cette expression rationnelle est requise pour correspondre à deux barres obliques; Tout le reste est facultatif. Ce n'est même pas suffisant pour identifier un regex * littéral *, et les expressions rationnelles peuvent aussi être écrites sous la forme de littéraux de chaînes (pas de barres obliques). Il n'est pas clair pour moi si le PO essaie de * localiser * regexes ou de * les valider *, mais cette regex ne fait ni l'un ni l'autre. –

+0

@Alan: Je donnais juste un exemple si la regex était définie littéralement car c'était la seule méthode que j'ai vu possible de trouver une regex via regex. – escproxy