使用正则表达式拆分字符串

Split a string using regex

本文关键字:字符串 拆分 正则表达式      更新时间:2023-09-26

我有一个字符串,我想被拆分成一个数组,这样它就被'+'分割,除非它在括号内

例如字符串

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

是否可以使用正则表达式执行此操作?

您可以使用正则表达式执行此操作,但只能使用支持递归正则表达式的语言(例如,perl 或任何语言 pre)。

使用 JavaScript 正则表达式并不容易,因为它们不支持递归。但是可以使用其他插件使用 XRegExp:

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

另外请检查以下两个链接:

  • http://blog.stevenlevithan.com/archives/regex-recursion
  • http://blog.stevenlevithan.com/archives/javascript-match-nested

我认为你不能用正则表达式做到这一点。编辑:每个银,你可以使用正则表达式。
一种方法是逐个字符解析字符串。我将在一分钟内用代码编辑我的答案。编辑:这是一个示例实现(注意:未经测试,可能有一两个错误):

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

这是一个要测试的小提琴。