如何匹配数组中的名称,如下所示:
[牛奶,南瓜饼,鸡蛋,果汁]
它还必须支持数组中的单个项目。这可行,但崩溃Reggy(一个正则表达式程序)可能是因为常量前瞻是一种压力。
([^,\[\]]+(?=,|\s*\]))
另请注意,我不想捕捉逗号或方括号 - 只是项目......
编辑:
我得到了:(?<=\[)([^\[\]]+)(?=,|\])
与项目和逗号匹配。
答案 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)