1

計算文字列を解析して照合するにはどうすればよいですか?

これは私のコードです:

$pattern = '/(?:\d+(?:\.\d+)?\D)+\d+(?:\.\d+)/';
$input = [
    '1.0+2.5*5.4',
    '5*8-4'
];
foreach($input as $string){
    preg_match($pattern, $string, $match);
    print_r($match);
}

何が間違っているのかわかりません。

4

3 に答える 3

2

これは " " の貪欲さによるものです。次のように " ?" を試してください+

$pattern = '/(?:\d+(?:\.\d+)?\D)+\d+(?:\.\d+)/';
$input = '34.27-15.44/8.44';
echo $input."\n";
preg_match($pattern, $input, $match);
print_r($match);

あなたの編集に関して:

$pattern = '/(?:\d+(?:\.?\d+)?\D)+\d+/';
$input = [
    '1.0+2.5*5.4',
    '5*8-4',
    '5*8-4string',
    'string5*8-4',
    'string'
];
foreach($input as $string){
    preg_match($pattern, $string, $match);
    print_r($match);
}

それは与えます:

Array
(
    [0] => 1.0+2.5*5.4
)
Array
(
    [0] => 5*8-4
)
Array
(
    [0] => 5*8-4
)
Array
(
    [0] => 5*8-4
)
Array
(
)

私はあなたがそれを望んでいると思うので。

http://codepad.viper-7.com/4FoQnB

于 2013-04-01T14:19:11.067 に答える
0

あなたの式を考えると、結果は期待されます。

\D1 回 (またはノンス) しか一致しないことに注意してください。\Dは と一致した-ため、他に一致するものはありません/

式の大部分に量指定子を配置することでこれを解決したくなるかもしれませんが、その方法で直面する問題を予測し、単一のオペランド-演算子-オペランドのトリプレットを1 つのループで置き換えることを提案します。時間、代替ができない場合は終了します。これは、操作の順序を適切に管理できる単一パスの正規表現 ( PEMDASなど) がないためです。

于 2013-04-01T14:23:14.993 に答える