簡體   English   中英

使用正則表達式分割字符串

[英]Split a string using regex

我有一個字符串,並且我希望將其拆分為一個數組,以便用“ +”符號進行拆分,除非它在方括號內

例如字符串

“ 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)”]]

是否可以使用正則表達式來做到這一點?

您可以使用regex進行此操作,但只能使用支持遞歸正則表達式的語言(例如,perl或使用PCRE的任何語言)。

使用JavaScript正則表達式並不容易,因為它們不支持遞歸。 但是可以通過其他插件使用XRegExp:

http://xregexp.com/plugins/#matchRecursive

另外,請檢查以下兩個鏈接:

我認為您不能使用正則表達式來做到這一點。 編輯:每銀,您可以使用正則表達式。
一種方法是僅逐字符解析字符串。 我將在一分鍾內用代碼編輯答案。 編輯:這是一個示例實現(注意:未經測試,可能有一個或兩個錯誤):

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
}

您可以使用String對象的match方法來執行此操作,並使用以下正則表達式:

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

此正則表達式將滿足您的需求。

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

看到它在這里行動。

有一個小問題:javascript正則表達式解析器中未實現負向后看(?!=...)

對於正在學習正則表達式的任何人,下面是一個演練:

(?!=\\([\\w\\+]+)是一個否定的后面。它的意思是“ ...之前沒有...”在這種情況下,我們正在尋找(lettersOr+沒有的東西。

\\+是我們想要的。 加號(轉義)

(?![\\w+\\+]+\\))是否定的前瞻。 它的意思是“不跟...”,在這種情況下,我們正在尋找不跟在lettersOr+)之后的東西。

此功能應為您工作:

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;
};

這是要測試的小提琴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM