Javascript “我怎么能?”;“计数字符”;在正则表达式中?

Javascript “我怎么能?”;“计数字符”;在正则表达式中?,javascript,regex,Javascript,Regex,我不确定count这个词是否合适,因为它对我来说有多少并不重要,但让我解释一下。我的数据格式如下:(hi,(1,2),嘿,(yo,(3,(rawr),4),howdy),我无法控制有多少维度。我想获取最低的组[“hi”,Array[],“hey”]和[“yo”,Array[],“howdy”],因此如果有一种方法可以“计数”,我可以计算开括号,然后计算闭括号,当它达到0时,正则表达式结束。例如: (hi,(1,2),hey),(yo,(3,(rawr),4),howdy) 1---2---1--

我不确定count这个词是否合适,因为它对我来说有多少并不重要,但让我解释一下。我的数据格式如下:
(hi,(1,2),嘿,(yo,(3,(rawr),4),howdy)
,我无法控制有多少维度。我想获取最低的组
[“hi”,Array[],“hey”]
[“yo”,Array[],“howdy”]
,因此如果有一种方法可以“计数”,我可以计算开括号,然后计算闭括号,当它达到0时,正则表达式结束。例如:

(hi,(1,2),hey),(yo,(3,(rawr),4),howdy)
1---2---1----0-1---2--3----2--1------0

话虽如此,我认为计数是不可能的,但我想要的是一个替代方案。这就是我到目前为止所拥有的
/\([^\(]*?\)/
),但它只返回每个低级组中的最高级别组,即
(1,2)
(rawr)

,如果您想要获得最高级别,您可能可以通过查找交点来使用regex,在本例中,
),(


演示:

您可以使用堆栈跟踪


在firebug控制台中尝试它。

这适用于原始用例和@Barmar的用例-如果您真的需要,它会计算括号

此外,我在数据字符串上添加了任意空格,以防万一(因为您无法控制传入的数据)

var结果=[];
var dataString=“(嗨,(1,2),嗨,(yo,(3,(rawr),4),你好)”;
//var dataString=“(嗨,(1,2),(3,4),嗨,(yo,(3,(rawr),4),你好)”;
var dataSplit=dataString.split(“,”);
var trimRegex=/^\s+|\s+$/g;
var openparesregex=/\(/;
var closeparesregex=/\)/;
var parensRegex=/\(|\)/;
var-parensCount=0;
对于(var x=0,lenx=dataSplit.length;x

希望有帮助!

以下脚本可能会有所帮助,它将识别括号级别:

var string="(hi,(1,2),hey),(yo,(3,(rawr),4),howdy)",i=0;
while (string.indexOf("(")>=0) {
    i++;
    string=string.replace(/\(([^()]+)\)/g,"|l"+i+"|$1|l"+i+"|");
}
结果: |l2 |嗨,| l1 | 1,2 | l1 |,嗨| l2 |,|l3 |哟,| l2 | 3,| l1 | rawr | l1 |,4 | l2 |,你好| l3|


Fiddle:

这在没有正则表达式的情况下很容易实现;正则表达式是一个要求吗?不是用javascript,而是用PHP很容易做到:
$re='/\(?:[^()]+++|(?R))*\)/;
@ridgerunner应该提到javascript不提供递归(R位)表达式匹配。@cheeken-是的,我知道不需要正则表达式也可以,但如果可以的话,我想使用正则表达式。与@cheeken的注释相同。你为什么需要正则表达式,是家庭作业吗?我认为这样不行。如果输入看起来像
(嗨,(1,2),(3,4),嘿,(3,(rawr),4),你好)
?你会匹配
),(
之间的
(1,2)
(3,4)
,这两个维度不是最高级别。我不知道是否是这样,至少通过查看示例,没有其他交叉点。他说“我无法控制维度的数量”,我解释为嵌套列表可以以任意方式分组。是的@Barmar是正确的。它们可以以任意方式嵌套。我想使用正则表达式来实现这一点。@Aust Javascript的正则表达式不支持可以匹配嵌套括号的表达式。其他一些语言支持,但在Javascript中,您必须使用diff不同的解决方案。这将返回一个数组中的所有项
[“hi”,“hey”,“yo”,“howdy”]
,但我希望它返回
[“hi”,数组[],“hey”]
[“yo”,数组[],“howdy”]
如果我不清楚的话,很抱歉。啊,是的,我误解了你最初的帖子。现在我一直在尝试使用递归来构建所需的结果集,但我不能完全得到它。无论如何,没有一个JavaScript RegExp可以做到这一点,如果这是你所希望的……祝你好运!
Array.reduce(
    '(hi,(1,2),hey),(yo,(3,(rawr),4),howdy)',
    function(x,y){
        if(y=='(')
            return [x[0]+1, x[1]+(x[0]+1)]
        else if(y==')')
            return [x[0]-1, x[1]+(x[0]-1)]
        else
            return [x[0], x[1]+'-']
    },
    [0,'']
)[1]
var results = [];
var dataString = "(hi, (1,2) , hey), ( yo,( 3, ( rawr   ), 4) ,   howdy  )";
//var dataString = "(hi, (1 , 2 ), (3, 4),   hey), (yo ,(3,(rawr ), 4), howdy)";


var dataSplit = dataString.split(",");

var trimRegex = /^\s+|\s+$/g;
var openParensRegex = /\(/;
var closeParensRegex = /\)/;
var parensRegex = /\(|\)/;

var parensCount = 0;

for (var x = 0, lenx = dataSplit.length; x < lenx; x++){
    var cleanString = dataSplit[x].replace(trimRegex, "");

    if (openParensRegex.test(cleanString)){ parensCount++; };

    if (parensCount < 2){
        results.push(cleanString.replace(parensRegex, "").replace(trimRegex, ""));
    };

    if (closeParensRegex.test(cleanString)){ parensCount--; };
};

console.log(results);
var string="(hi,(1,2),hey),(yo,(3,(rawr),4),howdy)",i=0;
while (string.indexOf("(")>=0) {
    i++;
    string=string.replace(/\(([^()]+)\)/g,"|l"+i+"|$1|l"+i+"|");
}