我能够提取到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的右上方面板中进行解释。如果你愿意,你也可以在这个链接中观察它是如何与一些样本输入匹配的。