Javascript “我怎么能?”;“计数字符”;在正则表达式中?
我不确定count这个词是否合适,因为它对我来说有多少并不重要,但让我解释一下。我的数据格式如下: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--
(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+"|");
}