验证以'&'结尾的逗号分隔列表的正则表达式是什么?还有一句话


What is the regular expression to validate a comma delimited list but ending with '&' and a word

我能够提取到11.20,但在此之后,逗号停止,我写的正则表达式失败。我怎么写这个表达式呢?我使用preg_match_all函数

输入字符串

:

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

输出需要:

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

$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);

打印

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

足够近吗?

不需要匹配逗号或&号,是吗?为什么不直接匹配你正在寻找的呢?

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

如果你不想把这个词放在结尾,那就把最后一个子句去掉。

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"]

这个表达式

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

也可以。

演示

$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);

如果您希望简化/修改/探索表达式,可以在regex101.com的右上方面板中进行解释。如果你愿意,你也可以在这个链接中观察它是如何与一些样本输入匹配的。