我有一个字符串,我想将其拆分为一个数组,以便将其拆分为“+”,除非它在括号内
例如字符串
“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)"]
是否可以使用正则表达式来做到这一点?
我有一个字符串,我想将其拆分为一个数组,以便将其拆分为“+”,除非它在括号内
例如字符串
“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 或任何具有 PCRE 的语言)。
JavaScript 正则表达式并不容易,因为它们不支持递归。但是可以使用 XRegExp 使用附加插件:
http://xregexp.com/plugins/#matchRecursive
也请检查这两个链接:
我不认为你可以用正则表达式做到这一点。编辑:每个 Silver,你可以使用正则表达式。
一种方法是逐个字符地解析字符串。我会在一分钟内用代码编辑我的答案。编辑:这是一个示例实现(注意:未经测试,可能有一两个错误):
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;
};