javascript中基于括号的拆分字符串

javascript中基于括号的拆分字符串,javascript,regex,string,split,parentheses,Javascript,Regex,String,Split,Parentheses,我有下面这样的字符串。 Sum(高度(英寸)) 我需要像这样拆分上面的字符串。 Sum 高度(英寸) 我试过跟着正则表达式。但是我没有运气 /[ .:;?!~,`"&|^\((.*)\)$<>{}\[\]\r\n/\\]+/ /[.:;?!~,`“&^\(.*)${}\[\]\r\n/\]+/ 有没有办法做到这一点 提前感谢。您可以将所有内容匹配到第一个(),然后匹配第一个(和字符串末尾的)之间的所有内容,并使用 const[\u,one,two]=“总和(高

我有下面这样的字符串。
Sum(高度(英寸))

我需要像这样拆分上面的字符串。
Sum

高度(英寸)

我试过跟着正则表达式。但是我没有运气

/[ .:;?!~,`"&|^\((.*)\)$<>{}\[\]\r\n/\\]+/
/[.:;?!~,`“&^\(.*)${}\[\]\r\n/\]+/
有没有办法做到这一点


提前感谢。

您可以将所有内容匹配到第一个
),然后匹配第一个
和字符串末尾的
之间的所有内容,并使用

const[\u,one,two]=“总和(高度(In))”。匹配(/^([^()])+)\((.*)\)$/;

console.log(`第一个值是:${one},第二个值是${two}`);
您可以这样做,但方式有限。您需要修复允许的最大括号数(级别数),因为无界大小写定义了一种不规则的语言。规则表达式可以接受规则语言(可由有限语法(称为正则语法或有限状态自动机)解析的语言),而无界级括号语言需要上下文无关语法(该算法通常作为基于堆栈的自动机实现)

wiktor Sribizew的响应指出的解决方案是有效的,如果您要接受任何可能有不平衡括号的表达式(开放的副焓大于闭合的,反之亦然)如果您想在与初始括号匹配的括号后完全关闭,则需要一个上下文无关的语法分析器。有关原因的解释,请参见下文

为了获得正则表达式,您必须表达能够形成最内部级别(最高嵌套级别)正则表达式的内容,即不允许使用开括号或闭括号的内容(对于这个解释,我将在括号的三个级别结束,但您可以将其扩展到更多级别,唯一的要求是您必须在某个级别停止,并且有足够的耐心来完成,因此我只在三个级别上完成)下面是一个正则表达式,它允许除括号以外的任何内容:

[^()]*
让我调用这个表达式
L0
。为了允许一对(或一个序列)括号匹配…我们可以有第二个regexp
L1
,如图所示(表示法
{L0}
--我会在括号周围放一对括号,以便更好地看到正则表达式中的运算符---表示上面的regexp):

这意味着一系列的
L0
表达式穿插在
L0
表达式中,每边都有一对括号。只有在这种情况下,我才会展开
{L0}
,以说明正则表达式在每个阶段是如何变得越来越复杂的(您可以使用程序构建此正则表达式,您将得到一个非常复杂的正则表达式,它可以非常高效地解析有限数量的嵌套括号)

(为了便于阅读,我在大括号周围留了空格,但要使用regexp,需要删除其中所有嵌入的空格)

此正则表达式可以称为
L1
,用于构建级别2的正则表达式。它将由以下序列组成:

{L1} (\( {L1} \) {L1} )*
其中,
{L1}
中的每一个都用上面得到的正则表达式展开。这个表达式将被称为
L2

在此之后,将看到一个模式,对于最大
n
级别,您必须重复此过程,在
Ln
上替换
n-1
级别表达式,即:

{Ln-1} (\( {Ln-1} \) {Ln-1} )*
这个正则表达式将被称为
Ln
。正则表达式的总长度在每个嵌套级别上至少乘以三倍,因此您可以预期,例如,对于六个级别的括号嵌套,您的regexp将有大约
6*3^(n)
或大约4375个字符。如果你有一台计算机,你可以用它来计算正则表达式,你可以编译它,看看它有多高效(一次只检查一个字符,如果一个括号中有六个级别的括号匹配,你就会得到)


若要超过几个级别,将给regexp带来严重问题,必须使用上下文无关语法解析器。解析包含超过10个括号级别的JSON数据结构是很常见的,这将需要大约为
6*3^10
(或大约360k个字符长)的regexp这使得这种方法不实用。

正则表达式不擅长处理嵌套括号之类的平衡结构。
const[\uu1,one,two]=text.match(/^([^()]+)\(.*)\)$/)
?有多少嵌套是可能的?任意表达式是可能的吗?正如Barmar提到的,您可能需要一个堆栈或解析器来处理递归和任何您希望处理的额外复杂性。另一种方法:
const[\uuu,one,two]=text.match(/(\w+)\(\w+\([^()]*\)/)
第一个按预期工作。谢谢@WiktorStribiżew
{L1} (\( {L1} \) {L1} )*
{Ln-1} (\( {Ln-1} \) {Ln-1} )*