使用正则表达式拆分字符串
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)"]
是否可以使用正则表达式执行此操作?
您可以使用正则表达式执行此操作,但只能使用支持递归正则表达式的语言(例如,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;
};
这是一个要测试的小提琴。
- 将字符串拆分为数组时出现JavaScript错误
- 如何将字符串拆分为字符,但在javascript中保留空格
- 将字符串拆分为;只要它's不在»«
- 如何将以下字符串拆分为二维数组:
- 将javascript中的字符串拆分为一个数组
- 这个字符串拆分器可以重构或改进吗
- Regex将字符串拆分为大小适中的块
- 将字符串拆分为具有固定字符数的数组
- 将字符串拆分为数组
- 如何在没有javascript中的split函数的情况下将字符串拆分为单词
- 字符串拆分并获取第一次和最后一次出现
- node.js将接收到的字符串拆分为不同的变量,然后格式化为json字符串
- 如何将复杂的字符串拆分为多个部分
- 将字符串拆分为多维数组
- 将逗号分隔的字符串拆分为单独的字符串
- 如何在 Javascript 中以特定间隔将字符串拆分为数组
- Javascript 字符串拆分
- 使用 jQuery 将长字符串拆分为文本块
- 在javascript中将字符串拆分为句子
- 在将字符串拆分为硒时获取空输出