2010-07-31 5 views
0

Dire que j'ai le schéma suivant:métacaractères intérieur un nombre illimité de fois en modèle externe

INDICATOR\s+([a-z0-9]+)

qui correspondrait par exemple:

INDICATOR AA ou INDICATOR B3

J'ai besoin de éditer ce modèle afin qu'il corresponde à toutes les instances d'une chaîne commençant par INDICATOR qui a un espace et qui a ensuite plusieurs correspondances du motif interne, par exemple

INDICATOR AA A3 66 B8 34 CD
INDICATOR BG 4D CS
INDICATOR HG

Est-il possible de le faire?

Solution

Merci à Gumbo je suis venu avec l'expression rationnelle suivante qui convient à mes besoins:

INDICATOR((\s+)?([,-])?(\s+)?([a-z0-9]+))+

+0

Votre regex améliorée correspondra également 'INDICATORXYZ123OU812' (en supposant une correspondance insensible à la casse, bien sûr). Voulez-vous vraiment faire correspondre les chaînes comme 'INDICATOR AABB', comme vous l'avez indiqué dans l'un de vos commentaires? Et quelle saveur de regex utilisez-vous, de toute façon? –

+0

@Alan: J'ai juste remarqué votre commentaire. Oui, je veux faire correspondre les modèles comme vous l'avez dit. Le modèle que j'utilise est un peu plus complexe que l'exemple, donc il est sécuritaire de ne pas avoir d'espaces. Je veux m'assurer que si l'entrée n'a pas d'espace, les motifs sont toujours récupérés. – James

Répondre

2

Essayez ceci:

INDICATOR(\s+([a-z0-9]+))+ 

Ici, le motif répétitif est enveloppé dans un groupe et quantifié en utilisant + pour permettre un ou plus de répétitions de l'expression à l'intérieur du groupe. Mais vous n'obtiendrez pas chaque match du groupe interne avec ceci mais seulement le dernier match (ou pour être plus précis: cela dépend de l'implémentation que vous utilisez).

+0

@Gumbo: Fondamentalement, j'ai juste besoin de faire correspondre la chaîne complète, puis je vais la reparer en utilisant seulement l'expression rationnelle interne pour extraire les données. Cette regex initiale est pour validation. – James

+0

@James: Ensuite, je suggère d'utiliser des groupes non-capturés '(?: ...)' au lieu de groupes "normaux" pour éviter les coûts de stockage de la chaîne capturée. – Gumbo

+0

@Gumbo: Cela me donne-t-il l'avantage de ne pas avoir à réanalyser la chaîne que je peux simplement parcourir sur les groupes? – James

Questions connexes