如何将数组项与正则表达式匹配

时间:2012-02-23 06:00:46

标签: regex arrays

如何匹配数组中的名称,如下所示:

  

[牛奶,南瓜饼,鸡蛋,果汁]

它还必须支持数组中的单个项目。这可行,但崩溃Reggy(一个正则表达式程序)可能是因为常量前瞻是一种压力。

([^,\[\]]+(?=,|\s*\]))

另请注意,我不想捕捉逗号或方括号 - 只是项目......

编辑:

我得到了:(?<=\[)([^\[\]]+)(?=,|\])与项目和逗号匹配。

4 个答案:

答案 0 :(得分:1)

这是我在.NET中的建议:

(?<=\[(?:[^\]]+,\s+)?) // Look behind for the start bracket and possibly previous values
([^\],]+)              // capture the value until the next comma or end bracket 
(?=,|])                // Look ahead and find a comma or end bracket

(仅为清晰起见分为多行。)

使用JavaScript的正则表达式变体的问题是缺少零宽度正面后置断言,如果要匹配数组的多个元素,则需要这样做。

答案 1 :(得分:1)

对于我能说的一切(我尝试使用Python及其内置的正则表达式),你的正则表达式没有任何问题。如果它导致Reggy崩溃,那可能是一个错误,应该报告。

但是,应该注意的是,你的正则表达式虽然避免了逗号和括号出现在匹配项中,但它确实包含逗号和项目开头之间的空格。例如,你会得到“南瓜派”(注意领先的空间),而不是“南瓜派”作为匹配。我没有看到任何直接的方法来避免这种情况。

一种方式,但可能不受Reggy支持,是使用来子选择匹配的相关部分。例如在Python中:

import re
text    = '[milk, pumpkin pie, eggs, juice]'
pattern = re.compile(r'\s*([^,\[\]]+)(?=,|\s*\])')

for match in pattern.finditer(text):
    print match.group(1)

注意正则表达式现在如何包含前导空格(\s+)和围绕匹配相关部分的圆括号:([^,\[\]]+)。在打印部分中,我将其称为group(1)

答案 2 :(得分:1)

javascript lookahead工作正常,这不会捕获逗号/空格序列:

    //only assumption is csv
    var data = '[milk, pumpkin pie, eggs, juice]';
            var myregexp = /[^,]+(?=,\s?|]$)/g;
            var match = myregexp.exec(data);
            var result = "matches found:\n";
            while (match != null) {
                //first match will include the [, strip it.
                result += match[0] + ',\n';
                match = myregexp.exec(data);
            }
            alert(result);

答案 3 :(得分:0)

尝试\b[\w ]+\b

这将匹配允许中间空格的多个单词([\w ]+)。由于+是贪婪的,它会匹配尽可能多的单词,但不会覆盖逗号或括号边界,因为它与\w或{不匹配{1}}。

你可以玩它here