2017-10-17 4 views
0

J'essaie de faire correspondre une chaîne comme "23.0 32.0". Voici mon regex:RegEx Ou avec Wildcard ne correspond pas

hrs_pnt_regex = /\s{2,}-?\d{1,2}\.\d(\s+|$)/ 

code:

x = " 23.0  32.0" 
x.to_enum(:scan, hrs_pnt_regex).map { Regexp.last_match } 

Résultat:

MatchData " 23.0  " 1:"  " 

Ce que je remarque est que le \ s + ne semble pas fonctionner dans les parens à la fin. Si je le change en "\ s \ s", il correspond aux deux nombres comme ça. Sinon, je ne reçois que le premier.

<MatchData " 23.0 " 1:" ">, <MatchData " 32.0" 1:""> 

Est-ce que + ne fonctionne pas avec un | après ça?

+0

Pourquoi '.to_enum' ici? Cela semble être une chose étrange à faire. – tadman

+0

J'ai trouvé cela comme un moyen d'obtenir tous les objets MatchData lorsque vous voulez appliquer une regex globalement à une chaîne. Dans le cas contraire, il retournera simplement les chaînes sans aucun objet qui vous donne la position de départ de la chaîne. –

+0

Si vous faites un 'match' avec un drapeau'/g' vous devriez obtenir toutes les correspondances. – tadman

Répondre

1

Le problème est que la partie (\s+|$) consomme les espaces dont les correspondances ultérieures ont besoin pour identifier la partie de départ. Vous êtes en train de saboter votre prochain tour en engloutissant tous ces espaces et en laissant le pointeur à la position 3 au début de 32.0. Tant qu'ils sont considérés comme faisant partie du premier match, ils ne seront pas disponibles pour la seconde.

Une solution rapide est:

x.scan(/\s{2,}(-?\d{1,2}\.\d)/) 
# => [["23.0"], ["32.0"]] 
0

La meilleure chose à faire ici est d'utiliser une ligne Regex Matcher. Mon préféré est RegExr.

mieux que je peux dire de votre description est que vous voulez faire correspondre les numéros simular à xx.y, auquel cas

hrs_pnt_regex = /\d{2,}\.\d{1,2}/ 

correspondra à deux ensembles, 23.0 et 32.0