实际上,我需要用whitespaces
分隔此行,而忽略括号中的内容(可以嵌套):
var string = 'a b c(a b c) d(a (b) c)'
进入此数组:
['a', 'b', 'c(a b c)', 'd(a (b) c)']
我的任务的实质是获取所有由空格分隔的变量和函数调用的列表
因此,用空格分开,括号中的所有内容都应忽略
我知道问这样的问题是多么愚蠢,但是对于正则表达式,我完全傻了,如果那样的话,准备等着开始赏金)Thx)
也许应该是这样的:
string = 'a b c(a b c) d(a (b) c)'.relaceWhitespacesinParentheses('&wh;')
// 'a b c(a&wh;b&wh;c) d(a&wh;(b)&wh;c)'
string.split(' ')
// ['a', 'b', 'c(a&wh;b&wh;c)', 'd(a&wh;(b)&wh;c)']
接下来的一切都很明显
答案 0 :(得分:4)
var str = 'a b d(a (b) c) c(a b c) e(a (f t(o a i) ) ) ';
str = str.trim();
var result = [];
var open_bracket = 0;
var curr_str = '';
for (var i = 0; i < str.length; ++i) {
if (str.charAt(i) === '(') open_bracket++;
if (str.charAt(i) === ')') open_bracket--;
if (str.charAt(i) == ' ') {
if (open_bracket == 0 && curr_str != '') {
result.push(curr_str);
curr_str = '';
} else if (open_bracket > 0) {
curr_str += str.charAt(i);
}
} else {
curr_str += str.charAt(i);
}
}
result.push(curr_str); // to include the last matched token.
console.log(result);
我们在字符串中逐个字符地移动。找到空间后,通过检查是否有方括号来查看是否需要将其容纳在输出结果中。如果是,则将其附加到临时结果curr_str
上,否则,将当前curr_str
添加到结果中。
答案 1 :(得分:3)
如果最多嵌套一层,则可以尝试this pattern。
var str = 'a b c(a b c) d(a (b) c)';
var res = str.match(/\w+\([^)(]*(?:\([^)(]*\)[^)(]*)*\)|\S+/g);
console.log(res);
您需要将每个层次的更深层嵌套添加到模式中。例如with max two levels(fyi)。
答案 2 :(得分:3)
也许是这样?可能有更整齐的方式
var string = 'a b c(a b c) d(a (b (a b c) d) c)'
var split = string.split(' ')
var numberOfBrackets = 0
var elements = []
split.reduce(function (acc, cur) {
if (cur.includes('(')) {numberOfBrackets++}
if (cur.includes(')')) {numberOfBrackets--}
if (numberOfBrackets !== 0) {
return acc + ' ' + cur
} else {
elements.push((acc + ' ' + cur).trim())
}
return ''
}, '')
console.log(elements)