2010-07-01 6 views
2

quelle est l'expression régulière d'une ligne de chaîne contenant UNIQUEMENT des nombres flottants séparés par des espaces ou des tabulations. Le nombre float peut être négatif, comme -999.999expression régulière: une ligne de chaîne contient uniquement des nombres flottants et des tabulations/espaces

+0

Quel est le format du numéro de flotteur? Des virgules? doit avoir des décimales? etc ... Ceci change drastiquement le RegEx –

+0

Si ça aide, '^ [- +]? \ d * \.? \ d * $' correspond à un flottant valide, avec des décimales optionnelles. J'ai une regexp brillante qui fonctionnerait, mais cette boîte de commentaire est trop petite pour l'inclure. –

+0

@Justin L: techniquement, cela pourrait correspondre '+ .' comme un 'flottant valide', ou même juste' + 'ou une chaîne vide. – Amber

Répondre

2

Formulons une regex pour un flottant, puis voyons ce que nous pouvons faire pour le reste.

Un flotteur est:

  • Un signe négatif en option
  • suivi d'un nombre de chiffres
  • suivi d'un point décimal en option, puis plusieurs chiffres
  • Suivi être « e »
  • Suivi par un certain nombre de chiffres (avec un signe facultatif).

Ajoutez à cela, et nous obtenons:

/-?[0-9]+(\.[0-9]+)?([Ee][+-]?[0-9]+)?/ 

Maintenant, cela est assez lâche, mais vous pouvez modifier si vous voulez serrer un peu. Maintenant, pour un certain nombre de ceux-ci avec des espaces entre les deux, il est assez trivial:

/^(F\s+)+$/ 

Mettez tout cela ensemble, nous nous retrouvons avec:

/^(-?[0-9]+(\.[0-9]+)?([Ee][+-]?[0-9]+)?\s+)+$/ 
+0

Vous pouvez généralement utiliser '\ d' au lieu de' [0-9] '.Aussi, que fait le 'F' dans votre second sous-régex? – Amber

+0

Amber, Stephen, comment s'assurer qu'aucune chaîne n'est dans cette ligne? – Paul

+1

@Amber: J'utilise cela comme un standin pour float regex, pour mieux montrer la structure de la solution résultante. @Paul: Les ancres au début et à la fin de l'expression rationnelle garantissent que le contenu * only * sur la ligne correspond bien à l'expression rationnelle. –

4
(?:-?(?:\d+(?:\.\d*)|.\d+)[ \t]*)+ 

est une possibilité. En format plus lisible:

(?: 
    -?     # Optional negative sign 
    (?: 
    \d+(?:\.\d*)  # Either an integer part with optional decimal part 
    | 
    .\d+    # Or a decimal part that starts with a period 
) 
    [ \t]*    # Followed by any number of tabs or spaces 
)+     # One or more times 
+0

Quel est le (?: Pour? – Paul

+1

@Paul: '(?:' Signifie un groupe * non-capturant * Normalement, lorsque vous enveloppez quelque chose entre parenthèses, le moteur regex garde la trace de ce qui correspond à ce truc, donc vous pouvez y accéder Une fois la regex terminée, c'est vraiment bon pour extraire des données, mais c'est un peu moins efficace que si le moteur n'avait pas besoin d'en garder trace. –

+1

Les groupes qui ne capturent pas sont également utiles si vous voulez capturer certaines données, mais aussi regrouper des éléments que vous ne capturez pas. – Amber

1

Un regex pour un flotteur ressemblerait à ceci: -?\d+\.?\d+

Un séparateur des espaces ressemble à ceci: \s

les mettre ensemble, lui permettre de répéter, assurez-vous l'extrémité comporte un flotteur (pas un séparateur):

((-?\d+\.?\d*)\s)*(-?\d+\.?\d*)) 

l'échappement et \d vs [0-9] pourrait changer, en fonction de votre saveur de regex.

Questions connexes