var a = 'New York or "United States or Canada" OR "England or France" Or Mexico';
我想要一个如下所示的数组:
var b = ['New York','United States or Canada', 'England or France', 'Mexico'];
基本上,应该拆分除引号之间的所有OR。
我需要在Javascript中执行此操作,我似乎无法让正则表达式完美运行。是否可以使用正则表达式进行,或者我必须使用正则表达式+一些javascript逻辑才能使其正常工作。
答案 0 :(得分:4)
试试这个
var b = a.split(/\s+or\s+(?=(?:[^"]*"[^"]*")*[^"]*$)/i)
答案 1 :(得分:1)
如果可以使用PHP,最简单的方法是使用php explode函数将数组拆分为“OR”。但是,如果您必须只使用Javascript,请尝试类似上面建议的回答者。
答案 2 :(得分:0)
最简单的方法就是“强制”在每个小组周围加上引号:
var a = '"New York" or "United States or Canada" OR "England or France" Or "Mexico"';
var out = a.replace("OR", "or").replace("Or", "or").split('" or "')
[ '"New York',
'United States or Canada',
'England or France',
'Mexico"' ]
但你可能会认为它在某种程度上是在作弊。
答案 3 :(得分:0)
不建议仅使用RegExes进行此操作,尽管在某些实现中甚至可能甚至可能使用JavaScript。您描述的语言不是常规语言,因此RegExes不是解决此问题的最佳方法(即使非常规语言可以使用诸如前瞻/后端,平衡组,递归等附加内容进行解析)。然而,RegExes可能有助于实现这样的解析器。以下代码应该做你想要的。
function splitOnOr(str) {
var patterns, pos, res, tokens, inQuotes;
patterns = [
{ name: "or", expr: /^\s+or\s+/i },
{ name: "words", expr: /^\w+/ },
{ name: "whitespace", expr: /^\s+/ },
{ name: "quote", expr: /^"/ }
];
pos = 0;
res = [""];
tokens = [];
inQuotes = false;
while (pos < str.length) {
for (i = 0; i < patterns.length; ++i) {
m = patterns[i].expr.exec(str.substr(pos));
if (m) {
pos += m[0].length;
tokens.push({type: patterns[i].name, payload: m[0]});
}
}
}
for (i = 0; i < tokens.length; ++i) {
switch (tokens[i].name) {
case "quote":
inQuotes = !inQuotes;
break;
case "or":
if (!inQuotes) {
res.push("");
break;
}
case default:
res[res.length-1] += tokens[i].payload;
}
}
return res;
}
这有多大意义吗?是的,但我试图说明一点,并在这里展示一些最佳实践:RegExes并不总是最好的解决方案,这种代码将扩展到更复杂的规则和问题。它也可能更快。我遵循编译器设计的基本原则(强调基本)。这将获取输入流并将其分配到令牌列表中:ors,其他词,空格和引号。然后它逐个使用这些令牌,并为每种令牌发送适当的代码,然后生成适当的输出。