首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >爆发菜谱列表元素的RegEx语法

爆发菜谱列表元素的RegEx语法
EN

Stack Overflow用户
提问于 2012-12-10 15:30:28
回答 3查看 234关注 0票数 2

我正在处理一份食谱配料清单,其中一个例子如下:

花生、小麦淀粉、植物油、变性淀粉、糖、孟买香料洋葱粉、草药和香料(孜然、咖喱粉、辣椒粉、香菜)、大蒜粉、氯化钾、酵母膏、酵母粉(含谷蛋白和大麦)、柠檬酸、调味料(含大麦、大豆、小麦、芹菜)、米粉、盐、色素(浓缩甜菜汁、姜黄素、木瓜提取物)。

我希望将每个成分分解成一个数组(使用PHP),用逗号分隔。我的问题是有些成分被细分了。在这个例子中,‘孟买辣味’的成分是由方括号分隔的,并且包含一些成分,子成分是由常规括号分隔的。

标准:

代码语言:javascript
复制
explode(",", $recipeStr) 

会给我一个非常混乱的结果,所以我正在寻找一个正则表达式语句,它会将每个不同的元素分解成一个数组,同时考虑到可选的方括号和可选的子括号。它还需要能够处理不嵌套在方括号内的方括号。

所需的结果将是一个如下所示的数组列表:

代码语言:javascript
复制
-Peanuts
-Wheat Starch
-Vegetable Oil
-Modified Starch
-Sugar
-Mumbai Spice Flavour [Onion Powder, Herbs and Spices (Cumin, Curry Powder, Chilli Powder, Coriander), Garlic Powder, Potassium Chloride, Yeast Extract, Yeast Powder (contains Gluten and Barley), Citric Acid, Flavouring (contains Barley, Soya, Wheat, Celery)]
-Rice Flour
-Salt
-Colours (Concentrated Beetroot Juice, Curcumin, Paprika Extract)

我不太擅长RegEx语法,因此,如果有任何答案也可以解释语法逻辑,这将是非常值得赞赏的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-10 15:43:46

这似乎有效(但也许这不是最好的解决方案):

代码语言:javascript
复制
preg_match_all('/\w[\w\s-]*(?:\[.*?\]|\(.*?\))?/', $string, $matches);

它检查单词字符,后面跟着0或多个字符/空格/破折号(添加任何想要捕获的内容到这个组中),然后跟着.或(.)或者没有(但是不能嵌套相同类型的括号)。

所以你可以:

代码语言:javascript
复制
- something
- anything [...]
- something different (...)
票数 1
EN

Stack Overflow用户

发布于 2012-12-10 15:42:32

啊,偏执-匹配不是正则表达式能轻易做到的。

也许您应该逐个字符地查看字符串:

代码语言:javascript
复制
$array = new Array();
$temp = "";

for($i = 0; $i < strlen($input); $i++)
{
    $c = $input[$i];
    if($c == '(')
        $paranthesis++;
    if($c == '[')
        $bracket++;

    if($c == ')')
        $paranthesis--;
    if($c == ']')
        $bracket--;
    if($c == ',' && $paranthesis + $bracket == 0)
    {
        $array[] = $temp;
        $temp = "";
    }
    else
        $temp .= $c;
}
$array[] = $temp;

我没有测试代码,但我希望它应该做什么是清楚的。

票数 1
EN

Stack Overflow用户

发布于 2012-12-10 16:02:26

这个正则表达式似乎适用于您的示例。你不会爆炸,但它确实捕获了每个项目/组,然后你可以循环通过。

代码语言:javascript
复制
([\w+ ]+\[[^\]]+\]|[\w+ ]+\([^\)]+\)|[\w+ ]+)

请参阅这里的演示

要把它分解:

代码语言:javascript
复制
(                      start capture group
[\w+ ]+\[[^\]]+\]    match any words followed by [...]
|                      or
[\w+ ]+\([^\)]+\)    match any words followed by (...)
|                      or
[\w+ ]+              match any other words
)                      end capture group
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13803955

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档