根据 javascript 中的括号拆分字符串
Split string based on parentheses in javascript
我有如下字符串。
Sum(Height(In))
我需要像这样拆分上面的字符串。
Sum
Height(In)
我试过遵循正则表达式。但是我没有运气。
/[ .:;?!~,`"&|^\((.*)\)$<>{}\[\]\r\n/\]+/
有什么办法可以实现吗?
提前致谢。
您可以匹配第一个 (
之前的所有内容,然后匹配第一个 (
和字符串末尾的 )
之间的所有内容,然后使用
const [_, one, two] = "Sum(Height(In))".match(/^([^()]+)\((.*)\)$/);
console.log(`The first value is: ${one}, the second is ${two}`);
参见regex demo。如果最后一个 )
不在字符串末尾,您可以删除字符串锚点的 $
结尾。如果里面可以换行,就把.*
换成[\w\W]*
.
正则表达式详细信息:
^
- 字符串开头
([^()]+)
- 第 1 组:(
和 )
以外的一个或多个字符
\(
- 一个 (
字符
(.*)
- 第 2 组:除换行字符外的任何零个或多个字符,尽可能多(*
是 greedy)
\)
- 一个 )
字符
$
- 字符串结尾。
你可以做到,但方式有限。您需要确定允许的最大括号数(级别数),因为无限制大小写定义了一种不规则的语言。正则表达式可以接受正则语言(可通过 有限 文法解析的语言,称为正则文法,或有限状态自动机),而无限级括号语言需要 上下文无关 语法(算法通常实现为基于堆栈的自动机)。
wiktor Sribizew 的响应所指向的解决方案将是有效的,如果你要接受任何可能有不平衡括号的表达式(打开的括号多于关闭的括号,反之亦然)如果你想恰好在括号之后关闭 匹配 初始的,那么你需要一个 context free 语法分析器。请参阅下文了解原因。
为了得到正则表达式,你必须表达什么可以构成最内部层次(在最高嵌套层次)的正则表达式,一些不允许左括号或右括号的东西(为了这个解释,我将以三级括号结束,但可以扩展到更多,唯一的要求是必须在某个级别停止,并且有足够的耐心去做,所以我只做三级)下面是一个常规允许除括号外的任何表达式:
[^()]*
让我称这个表达式为L0
。允许匹配的一对(或一系列)括号......我们可以有第二个正则表达式 L1
形成如图所示(符号 {L0}
---我将在周围放置一对括号大括号可以让您更好地看到正则表达式中的运算符---表示上面的正则表达式):
{L0} (\( {L0} \) {L0} )*
这意味着一系列 L0
表达式穿插在 L0
表达式中,每边都有一对括号。我将仅在这种情况下展开 {L0}
以说明正则表达式如何在每个阶段变得越来越复杂(您可以使用程序构建此正则表达式,您将获得一个非常复杂的正则表达式来解析嵌套括号的数量有限,非常有效)
[^()]* (\( [^()]* \) [^()]* )*
(为了便于阅读,我在大括号周围留了空格,但要使用正则表达式,您需要消除其中的所有嵌入空格)
这个正则表达式可以被称为L1
,将帮助我们构建第2级的正则表达式。这将由以下序列组成:
{L1} (\( {L1} \) {L1} )*
其中每个 {L1}
都使用我们上面得到的正则表达式进行扩展。这个表达式将被称为 L2
.
在此之后,可以看到一个模式,对于最多 n
个级别,您将不得不重复此过程,将 n-1
级别表达式替换为 Ln
,即:
{Ln-1} (\( {Ln-1} \) {Ln-1} )*
这个正则表达式将被称为Ln
。正则表达式的总长度在每个嵌套级别至少乘以三倍,因此您可以预期,例如嵌套正则表达式的六层括号将包含大约 6*3^(n)
或大约 4375 个字符。如果你有一台计算机,你可以用它来计算正则表达式,你可以编译它并查看它的效率(一次通过,一次只检查一个字符,你会得到是否有多达六级的括号括号匹配)
要超过几个级别会给正则表达式带来严重的问题,必须使用上下文无关语法分析器。解析具有超过 10 级括号的 JSON 数据结构是很常见的,这将需要大约 6*3^10
(或大约 360k 个字符长)的正则表达式,这使得这种方法不实用。
我有如下字符串。
Sum(Height(In))
我需要像这样拆分上面的字符串。
Sum
Height(In)
我试过遵循正则表达式。但是我没有运气。
/[ .:;?!~,`"&|^\((.*)\)$<>{}\[\]\r\n/\]+/
有什么办法可以实现吗?
提前致谢。
您可以匹配第一个 (
之前的所有内容,然后匹配第一个 (
和字符串末尾的 )
之间的所有内容,然后使用
const [_, one, two] = "Sum(Height(In))".match(/^([^()]+)\((.*)\)$/);
console.log(`The first value is: ${one}, the second is ${two}`);
参见regex demo。如果最后一个 )
不在字符串末尾,您可以删除字符串锚点的 $
结尾。如果里面可以换行,就把.*
换成[\w\W]*
.
正则表达式详细信息:
^
- 字符串开头([^()]+)
- 第 1 组:(
和)
以外的一个或多个字符
\(
- 一个(
字符(.*)
- 第 2 组:除换行字符外的任何零个或多个字符,尽可能多(*
是 greedy)\)
- 一个)
字符$
- 字符串结尾。
你可以做到,但方式有限。您需要确定允许的最大括号数(级别数),因为无限制大小写定义了一种不规则的语言。正则表达式可以接受正则语言(可通过 有限 文法解析的语言,称为正则文法,或有限状态自动机),而无限级括号语言需要 上下文无关 语法(算法通常实现为基于堆栈的自动机)。
wiktor Sribizew 的响应所指向的解决方案将是有效的,如果你要接受任何可能有不平衡括号的表达式(打开的括号多于关闭的括号,反之亦然)如果你想恰好在括号之后关闭 匹配 初始的,那么你需要一个 context free 语法分析器。请参阅下文了解原因。
为了得到正则表达式,你必须表达什么可以构成最内部层次(在最高嵌套层次)的正则表达式,一些不允许左括号或右括号的东西(为了这个解释,我将以三级括号结束,但可以扩展到更多,唯一的要求是必须在某个级别停止,并且有足够的耐心去做,所以我只做三级)下面是一个常规允许除括号外的任何表达式:
[^()]*
让我称这个表达式为L0
。允许匹配的一对(或一系列)括号......我们可以有第二个正则表达式 L1
形成如图所示(符号 {L0}
---我将在周围放置一对括号大括号可以让您更好地看到正则表达式中的运算符---表示上面的正则表达式):
{L0} (\( {L0} \) {L0} )*
这意味着一系列 L0
表达式穿插在 L0
表达式中,每边都有一对括号。我将仅在这种情况下展开 {L0}
以说明正则表达式如何在每个阶段变得越来越复杂(您可以使用程序构建此正则表达式,您将获得一个非常复杂的正则表达式来解析嵌套括号的数量有限,非常有效)
[^()]* (\( [^()]* \) [^()]* )*
(为了便于阅读,我在大括号周围留了空格,但要使用正则表达式,您需要消除其中的所有嵌入空格)
这个正则表达式可以被称为L1
,将帮助我们构建第2级的正则表达式。这将由以下序列组成:
{L1} (\( {L1} \) {L1} )*
其中每个 {L1}
都使用我们上面得到的正则表达式进行扩展。这个表达式将被称为 L2
.
在此之后,可以看到一个模式,对于最多 n
个级别,您将不得不重复此过程,将 n-1
级别表达式替换为 Ln
,即:
{Ln-1} (\( {Ln-1} \) {Ln-1} )*
这个正则表达式将被称为Ln
。正则表达式的总长度在每个嵌套级别至少乘以三倍,因此您可以预期,例如嵌套正则表达式的六层括号将包含大约 6*3^(n)
或大约 4375 个字符。如果你有一台计算机,你可以用它来计算正则表达式,你可以编译它并查看它的效率(一次通过,一次只检查一个字符,你会得到是否有多达六级的括号括号匹配)
要超过几个级别会给正则表达式带来严重的问题,必须使用上下文无关语法分析器。解析具有超过 10 级括号的 JSON 数据结构是很常见的,这将需要大约 6*3^10
(或大约 360k 个字符长)的正则表达式,这使得这种方法不实用。