2014-01-29 82 views
0
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中這樣做,我似乎無法讓正則表達式完美工作。是否有可能使用正則表達式來完成,還是必須使用Regex +一些JavaScript邏輯來使其正常工作。

+1

無法僅通過RegEx執行此操作,您需要lookbehinds,目前尚不支持。 :( –

+0

@ElliotBonneville顯然你錯了;) – brandonscript

回答

4

試試這個

var b = a.split(/\s+or\s+(?=(?:[^"]*"[^"]*")*[^"]*$)/i) 
+0

是的,它的工作原理。然而,那些帶有引號的引號(即:第二個條目顯示爲「美國或加拿大」,而不是「美國或加拿大」) – user3241857

1

這是最簡單的使用PHP爆炸功能的陣列分割上「或」 S如果你可以使用PHP。但是,如果您只能使用Javascript,請嘗試使用上述回答者推薦的內容。

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"' ] 

,但你可能會認爲以某種方式欺騙。

0

這樣做只使用RegExes是不可取的,儘管它在某些實現中可能甚至可能是JavaScript。你描述的語言不是經常性的,因此RegExes不是解決這個問題的最佳解決方案(儘管非常規語言可以用諸如lookaheads/-behinds,平衡組,遞歸等的附加語法來解析。 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,其他詞,空格和引號。然後它會逐個使用這些令牌,併爲每種令牌分配相應的代碼,然後生成相應的輸出。