Поиск десятичных чисел в строке с помощью регулярных выражений - PullRequest
3 голосов
/ 16 августа 2011

У меня возникла десятичная проблема при анализе моей команды. 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
    )

)

Ответы [ 2 ]

5 голосов
/ 16 августа 2011

\w класс не включает ., поэтому «быстрое» исправление - добавить его следующим образом:

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

Есть ли у вас какие-либо другие требования относительно того, где разрешен период?(то есть только совпадение, когда оно находится между числами?).Если это так, вам может потребоваться сделать сопоставление более специализированным.

Самая большая вещь, которая бросается в глаза, это то, что точка будет использоваться в качестве разделителя для какого-либо другого аспекта вашего синтаксического анализатора.Если RE, который вы дали, является вашим парсером, то вы вероятно ок.

2 голосов
/ 16 августа 2011

Это работает для меня:

/[a-zA-Z0-9_\.]+|:|,|".*?"/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...