匹配数量和单位的正则表达式

时间:2010-08-07 15:10:24

标签: php javascript regex

我需要从像这样的字符串中提取数量和单位

1 tbsp
1tbsp 
300ml
300 ml
10grams
10 g

数量永远是数字,那么单位可能有也可能没有空格。它们可能是15到20个不同的单位,可以来自我们定义的列表(可能是数组)

解决方案可以是javascript或PHP,因为我需要在将它们存储到数据库之前将它们拆分。即它们需要分开存放。

由于

编辑:很抱歉要清楚。每个新行代表一个新字符串。那就是字符串只包含10g OR 300ml - 所以我们只需要一次拆分一个单位和一个数量。

3 个答案:

答案 0 :(得分:4)

好的,你可以做的是创建一个允许的单元数组,然后使用array_map在数组中的每个单元上应用preg_quote(这样如果单元中有任何字符,是正则表达式中的特殊字符,它们将被转义),然后构造正则表达式:

$units = array("tbsp", "ml", "g", "grams"); // add whatever other units are allowed
$pattern = '/^(\d+)\s*(' . join("|", array_map("preg_quote", $units)) . ')$/';

$pattern因此会变成/^(\d+)\s*(tbsp|ml|g|grams)$/,然后您可以使用它来检测字符串中的单位内容:

$matches = array();
// assuming you have an array of measurement strings...
foreach ($measurement_strings as $measurement)
{
  preg_match($pattern, $measurement, $matches);
  list(, $quantity, $unit) = $matches;
  // ...
}

因为模式定义了两个捕获组,分别为数量和单位,然后你可以从匹配中提取它们并用它们做你想要的。

(我根据问题更新更新了我的答案,每行都是一个单独的字符串。)

答案 1 :(得分:4)

正则表达式:

/(\d+)\s*(\D+)/

代码:

preg_match_all('/(\d+)\s*(\D+)/', $ingredients, $m);

$quantities = $m[1];
$units = array_map('trim', $m[2]);

$quantities$units是:

Array
(
    [0] => 1
    [1] => 1
    [2] => 300
    [3] => 300
    [4] => 10
    [5] => 10
)
Array
(
    [0] => tbsp
    [1] => tbsp
    [2] => ml
    [3] => ml
    [4] => grams
    [5] => g
)

请参阅:http://ideone.com/MSH8t

如果使用此功能,则无需准备好单位列表。但这假设您的单位上没有数字字符,而您的数量仅为数字。

答案 2 :(得分:2)

Mabye简单就足够了,就像那样:

^([0-9]+)\s*([a-zA-Z]+)\s*$