带有正则表达式的 Sscanf 甚至可以匹配空字符串

Sscanf with regex to match even an empty string

我在 sscanf 中使用这个正则表达式

sscanf($seat, "%d-%[^(](%[^@]@%[^)])");

当我得到这种字符串时它工作得很好: 173-9B(AA@3.45 EUR@32H) 但是当我得到这种字符串时: 173-9B(@3.14 EUR@32H)

都乱七八糟的,我怎么也接受第一个(和第一个@之间的空字符串?

您最好在 preg_match 中使用正则表达式来处理输入中存在的可选数据:

$re = '/(\d*)-([^(]*)\(([^@]*)@([^)]*)\)/';

preg_match($re, '173-9B(@3.45 EUR@32H)', $m);
unset($m[0]);
print_r($m);

输出:

Array
(
    [1] => 173
    [2] => 9B
    [3] =>
    [4] => 3.45 EUR@32H
)

第二个例子:

preg_match($re, '173-9B(AA@3.45 EUR@32H)', $m);
unset($m[0]);
print_r($m);

Array
(
    [1] => 173
    [2] => 9B
    [3] => AA
    [4] => 3.45 EUR@32H
)

使用 ([^@]*) 将使其匹配另外 0 个不是 @.

的字符