带引号的正则表达式

时间:2014-01-29 19:39:04

标签: javascript regex

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逻辑才能使其正常工作。

4 个答案:

答案 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,其他词,空格和引号。然后它逐个使用这些令牌,并为每种令牌发送适当的代码,然后生成适当的输出。