2012-08-08 86 views
1

我有一個字符串,我想被分成數組,以便它是由「+」分裂,除非它是括號內拆分使用正則表達式

例如串字符串

「ABC + OR + DEF + OR +(ABC + AND + DEF)」

變得

[ 「ABC」, 「OR」, 「DEF」, 「OR」, 「(ABC + AND + DEF)」]

和字符串

「(ABC + AND + CDE)+ OR +(ABC + AND +(CDE + AND + FGH))」

變得

[ 「(ABC + AND + CDE)」,「OR 「,」(abc + AND +(cde + AND + fgh)「]

使用正則表達式可以做到這一點嗎?

+4

豈不更容易使用真正的解析器嗎?他的第二個例子中 – 2012-08-08 18:29:17

回答

2

我不認爲你可以用正則表達式來做到這一點。編輯:每銀子,你可以使用正則表達式。
一種方法是隻是逐個字符地解析字符串。我會在一分鐘內用代碼編輯我的答案。 編輯:下面是一個簡單的實現(注:未經測試,可能有錯誤或兩個):

function parseString (str) { 
    var splitStr = [], parentheses = 0, i = 0 
    for (var j = 0; j < str.length; j++) { 
    if (str[j] == '+' && !parentheses) 
     i++ 
    else if (str[j] == '(') 
     parentheses++ 
    else if (str[j] == ')') 
     parentheses-- 
    else 
     splitStr[i] += str[j] 
    } 
    return splitStr 
} 
0

您可以使用匹配方法String對象來做到這一點,並使用以下正則表達式:

stringObj.match(/([a-zA-Z]+)|([(]([a-zA-Z]+[+])+[a-zA-Z]+[)])+/gi); 
+0

失敗 – Esailija 2012-08-08 18:43:32

0

這個正則表達式可以滿足您的需求。

(?!=\([\w\+]+)\+(?![\w+\+]+\))

看到它在行動here

存在一個小問題:在javascript正則表達式分析器中沒有實現負面倒序(?!=...)

對於任何人誰是學習正則表達式,這裏是一個演練:

(?!=\([\w\+]+)是負回顧後。這意味着「沒有......先於......」在這種情況下,我們正在尋找之前沒有(lettersOr+的東西。

\+是我們正在尋找。加號(轉義)

(?![\w+\+]+\))是一個負向預測。它的意思是「不跟......」在這種情況下,我們正在尋找的東西不跟lettersOr+)

0

這個功能應該爲你工作:

var PARENTH_STRING_PLACE_HOLDER = '__PARSTRINGHOLDER__'; 

var splitPlusNoParenthesis = function(str){ 
    //Replace the parenthStrings with the placeholder 
    var parenthStrings = getParenthesizedStrings(str); 
    for(var i = 0; i < parenthStrings.length; i++){ 
     str = str.replace(parenthStrings[i], PARENTH_STRING_PLACE_HOLDER); 
    } 

    //Split on '+' 
    var splitString = str.split('+'); 

    //Replace all placeholders with the actual values 
    var parIndex = 0; 
    for(var i = 0; i < splitString.length; i++){ 
     if(splitString[i] === PARENTH_STRING_PLACE_HOLDER){ 
      splitString[i] = parenthStrings[parIndex++]; 
     } 
    } 

    return splitString; 
}; 

var getParenthesizedStrings = function(str){ 
    var parenthStrings = []; 

    for(var startIndex = 0; startIndex < str.length; startIndex++){ 
     if(str[startIndex] === '('){ 
      var parenthCount = 1; 

      var endIndex = startIndex + 1; 
      for(; endIndex < str.length; endIndex++){ 
       var character = str[endIndex]; 
       if(character === '('){ 
        parenthCount++; 
       } else if(character === ')'){ 
        parenthCount--; 
       } 

       if(!parenthCount){ 
        parenthStrings.push(str.substring(startIndex, endIndex + 1)); 
        break; 
       } 
      } 
      startIndex = endIndex; 
     } 
    } 

    return parenthStrings; 
}; 

Here's a fiddle to test.