12
votes

Comment correspondrai à une chaîne jusqu'à la première virgule (le cas échéant) avec un Ruby Regexp

J'ai du mal à obtenir une regexp (en rubis) qui fournira le suivant xxx pré>

je veux correspondre à tous les caractères jusqu'à la première virgule d'une chaîne. S'il n'y a pas de virgule, je veux que la chaîne entière soit appariée. Mon meilleur effort jusqu'à présent est P>

"one, two" -> "one"
"one, two, three" -> "one, two"
"one two three" -> "one two three"


0 commentaires

4 Réponses :


2
votes

Que diriez-vous de /.*? (? =, | $) / de cette façon de se lit à la fin ou à une virgule.


1 commentaires

Mais s'il fait /.*? (? =,)? / , ne correspondrait pas à la chaîne vide?



11
votes

assortir uniquement des non-virgules du début du début? E.G.:

/^[^,]+/


5 commentaires

J'ai eu une idée similaire. Je pense que vous avez besoin de parens pour la capture, mais je peux voler votre ancre de départ.


@Telemachus, vous n'avez pas besoin de parents pour que l'ensemble du regex correspond à la chaîne requise.


@Telemachus, dépend de la façon dont vous l'utilisez, E.G.: String.Match (/.../) retournerait tout ce qui correspond à la regex ou à la nil si rien ne correspondait, aucune capture n'est nécessaire. EDIT: Ce que c'est dit.


@Larsh Peut-être que je suis confus, mais sans les parens, 1 $ n'est pas défini (si la regex correspond à la chaîne entière ou à une sous-chaîne).


@pbaumann Assez assez - je vois maintenant qu'il n'utilisait pas nécessairement = ~ .



21
votes

Je me demande si cela ne peut pas être plus simple: xxx


1 commentaires

Essayez (. *?), pour trouver juste dans la ligne actuelle



15
votes

Est-ce que avez-vous être une regex? Une autre solution: xxx


4 commentaires

Il ne faut pas être - mais je veux 'il faut


Curieuse. Pourquoi voulez-vous que ce soit une regex? Y a-t-il un avantage?


@brad pour ce que ça vaut la peine, vous ne devriez pas avoir l'habitude de penser que tous les problèmes de chaîne nécessitent des regextes. Vous pouvez gérer de nombreux cas d'une autre manière.


J'utiliserais 'text'.split (' ", '). Premier qui évite entièrement une regex. :-)