2011-02-02 2 views
0

J'ai lutté avec cela toute la matinée. En espérant que certains gourous regex peuvent me diriger dans la bonne direction. Fondamentalement, j'utilise regex pour comparer deux valeurs de chaîne. La même regex doit être appliquée aux deux chaînes, et si toutes les valeurs de tous les groupes nommés correspondent, nous considérons la chaîne équivalente (cette vérification de groupe nommé est faite dans le code).Regex de capture nommé avec deux variantes

Pour les chaînes, j'ai quelque chose comme "jw-cst" qui doit être comparé à "cst". La regex dont j'ai besoin devrait considérer ces équivalents, car tout ce qui précède et incluant le '-' ne devrait pas être capturé dans le groupe nommé.

Alors ...

jw-cst -> Valeur de capture groupe = "cst" cst -> Valeur de capture groupe = "cst"

Le nom du groupe de capture est hors de propos, l'application Je travaille avec simplement des boucles à travers chaque groupe capturé s'assure qu'ils correspondent aux deux résultats.

Jusqu'à présent, j'ai ceci: (?... (< = -) | *)

Mais il semble utiliser la deuxième condition de correspondance ... donc toujours des retours "jw-cst" au lieu de simplement "cst". Si j'enlève la deuxième alternative (. *), Cela correspondra correctement ... Toute aide serait grandement appréciée.

+0

Est-ce seulement le type de chaîne sur lequel vous travaillez? Dans ce cas, un simple '/-((**)$/' suffirait. Mais je suis sûr que c'est plus compliqué. Alors pouvez-vous fournir une vraie chaîne et ce que vous attendez de correspondre? – Pierre

+0

Vous devez donner des exemples spécifiques et complets de bonnes entrées et de mauvaises entrées. – tchrist

+0

Un ensemble de chaînes sera composé de 2 ou 3 caractères (initiales, c.-à-d. BL ou MRK), l'autre jeu de chaînes sera le même que le précédent (initiales, c.-à-d. BL ou MRK) ou une combinaison de deux initiales , jamais plus (ie BL-MRK ou DLN-MRK). Je serai toujours en correspondance avec le second jeu d'initiales (c'est-à-dire si la chaîne est BL-MRK, je ne suis intéressé que par la partie MRK). Exemples: 1) ALK 2) ALK capture: ALK 1) BLK-CRS 2) CRS Capture: CRS 1) DN-ELB 2) ELB Capture: ELB 1) FN-GA 2) GA capture: GA – Jason

Répondre

1

Vous pouvez utiliser cette regex:

^(?:\w+-)?(\w+)$ 

et l'appliquer aux deux chaînes. Le groupe de capture 1 devrait alors contenir une chaîne identique.

Cela n'impose aucune restriction sur la longueur de la chaîne et autorise les caractères alphanumériques; si vous voulez seulement pour permettre 2 à 3 caractères ASCII par exemple, vous pouvez utiliser

^(?:[A-Z]{2,3}-)?([A-Z]{2,3})$ 

Si vous donnez des informations sur la langue de programmation (et donc quel moteur de regex) que vous utilisez, je pourrais avoir plus de conseils pour toi.

Dans .NET, vous pouvez également utiliser:

(?<=^(?:\w+-)?)\w+$ 

De cette façon, tout le match sera composé de la partie "deuxième".

+0

Très bien! Merci, c'est tout. Pour référence, utiliser .Net comme moteur regex. La première regex que vous avez fournie fait l'affaire très bien.Je pense que j'étais trop accroché sur le | au lieu de regarder une solution plus simple. Merci encore pour votre temps. – Jason