php - 通过正则表达式查找字符串中的十进制数

标签 php regex decimal

我在解析我的命令时遇到小数问题。 12.90 解析错误:

// My command
$cmd = 'CREATE product price:12.90, name: "Create me"';

// My parser
preg_match_all('/\w+|".*?"|(?!\s)\W/', $cmd, $list);

输出:

Array
    (
        [0] => CREATE
        [1] => product
        [2] => price
        [3] => :
        [4] => 12 // << problem starts here
        [5] => .
        [6] => 90
        [7] => ,
        [8] => name
        [9] => :
        [10] => "Create me"
    )

我正在寻找这个输出:

Array
    (
        [0] => CREATE
        [1] => product
        [2] => price
        [3] => :
        [4] => 12.90 // supposed
        [5] => ,
        [6] => name
        [7] => :
        [8] => "Create me"
    )

那么,我该如何解决这个问题呢?

编辑:(更好的解决方案)

伙计们,根据我的问题,我接受了杰西的回答。但我意识到这对我的复杂命令来说还不够好。它更好,因为它适用于 小数点,如 12.90别名,如 p.price。因此,只需查看下面的示例和解析器即可。我希望这对某人有所帮助。

// My command
$cmd = 'GET `order` -o, product -p 
           LIST o.user_id, o.product_id, p.name, p.price
           REL o.order_id = 3 AND p.price > 12.90'; 

// My complex command:
preg_match_all('/[0-9_\.]+|\w+|".*?"|`.*?`|\'.*?\'|!=|<=|>=|(?!\s)\W/', $cmd, $list); 

// Output:  
Array
(
[0] => Array
    (
        [0] => GET
        [1] => `order`
        [2] => -
        [3] => o
        [4] => ,
        [5] => product
        [6] => -
        [7] => p
        [8] => LIST
        [9] => o
        [10] => .
        [11] => user_id
        [12] => ,
        [13] => o
        [14] => .
        [15] => product_id
        [16] => ,
        [17] => p
        [18] => .
        [19] => name
        [20] => ,
        [21] => p
        [22] => .
        [23] => price
        [24] => REL
        [25] => o
        [26] => .
        [27] => order_id
        [28] => =
        [29] => 3
        [30] => AND
        [31] => p
        [32] => .
        [33] => price
        [34] => >
        [35] => 12.90
    )

)

最佳答案

\w 类不包含 . 因此“快速”修复是按如下方式添加它:

  preg_match_all('/[\w.]+|".*?"|(?!\s)\W/', $cmd, $list);

对于允许的期限,您还有其他要求吗? (即只有在数字之间时才匹配?)。如果是这样,您可能需要使匹配更加特化。

让我突然想到的最重要的事情是句点是否会用作解析器其他方面的分隔符。如果您提供的 RE 是您的整个解析器,那么您可能没问题。

关于php - 通过正则表达式查找字符串中的十进制数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7071049/

相关文章:

javascript - 如何打印 html 代码以便我只写一次?

php - 使用 PHP PDO 搜索/插入/更新 MySQL 数据库时确保电子邮件为小写

r - 为什么在应用 as.numeric 时 R 会丢弃小数?

javascript - 无法验证连字符

javascript - 将类似的正则表达式检查合并到一个 JS 中

decimal - 十六进制 0x0001 与 0x00000001

带小数点的数字中的 Perl 奇怪行为

php - 是否可以缩短 $mysqli->queries ?

php - 字符串/数组格式用php转换

java - 带有模式/匹配器的 IllegalStateException