2 votes

Quelle est l'expression régulière pour valider une liste délimitée par des virgules mais se terminant par '&' et un mot

Je suis capable d'extraire jusqu'à 11.20 mais après cela, la virgule s'arrête et la regex que j'ai écrite échoue. Comment puis-je écrire cette expression ? J'utilise preg_match_all fonction.

chaîne d'entrée :

8, 8.40, 9.20, 10, 10.40, 11.20, 12 & 12.40 latenight

sortie nécessaire :

Array
    (

        [0] =>  8,
        [1] =>  8.40,
        [2] =>  9.20,
        [3] =>  10,
        [4] =>  10.40,
        [5] =>  11.20,
        [6] =>  12,
        [7] =>  12.40,
    )

5voto

Tomalak Points 150423
$string = '8, 8.40, 9.20, 10, 10.40, 11.20, 12 & 12.40 latenight';
$string = str_replace('&', ',', $string);
$string = str_replace(' ', ',', $string);

$parts  = preg_split('/,+/', $string);

print_r($parts);

imprime

Array
(
    [0] => 8
    [1] => 8.40
    [2] => 9.20
    [3] => 10
    [4] => 10.40
    [5] => 11.20
    [6] => 12
    [7] => 12.40
    [8] => latenight
)

Assez proche ?

3voto

meouw Points 21368

Il n'est pas nécessaire de faire correspondre la virgule ou l'esperluette, n'est-ce pas ? Pourquoi ne pas simplement faire correspondre ce que vous cherchez ?

var str = "8, 8.40, 9.20, 10, 10.40, 11.20, 12 & 12.40 latenight";

var res = str.match( /\d+(\.\d{2})?|\w+$/g );

console.log( res ); //["8", "8.40", "9.20", "10", "10.40", "11.20", "12", "12.40", "latenight"]

//RegExp parts

\d+      - 1 or more digits 
(        - start optional group
  \.     - a literal decimal point
  \d{2}  - exactly 2 digits
)?       - end optional group
|        - or
\w+$     - a word at the end of the string

Si vous ne voulez pas le mot à la fin, laissez la dernière clause.

var str = "8, 8.40, 9.20, 10, 10.40, 11.20, 12 & 12.40 latenight";

var res = str.match( /\d+(\.\d{2})?/g );

console.log( res ); //["8", "8.40", "9.20", "10", "10.40", "11.20", "12", "12.40"]

0voto

Emma Points 1

Cette expression,

[0-9]*(?:\.?[0-9]+)?(?=\s*&|\s*,)

aurait pu fonctionner aussi.

Démo

$re = '/[0-9]*(?:\.?[0-9]+)?(?=\s*&|\s*,)/s';
$str = '8, 8.40, 9.20, 10, 10.40, 11.20, 12 & 12.40 latenight';

preg_match_all($re, $str, $matches, PREG_SET_ORDER, 0);

var_dump($matches);

Si vous souhaitez simplifier/modifier/explorer l'expression, elle a été expliquée dans le panneau supérieur droit de la page regex101.com . Si vous le souhaitez, vous pouvez également regarder en ce lien comment il se comporterait par rapport à certains échantillons.


Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X