Regex 单对(嵌套)方括号的正则表达式,但不包括中间叶括号?

Regex 单对(嵌套)方括号的正则表达式,但不包括中间叶括号?,regex,parsing,state-machine,regular-language,Regex,Parsing,State Machine,Regular Language,在SO和其他地方有很多匹配括号或方括号对的解决方案,但我找不到或想出任何排除中间叶项目的方法。这一挑战的解决方案是什么: 为包含任意数量X的字符串编写正则表达式 以及和{}的单个对,它们可以嵌套,但不能嵌套 中间叶的。例如,允许使用以下字符串: XXXX X{X}XX{X}XX 但这些是不允许的: XXXXX XXXX}XX 这可以用正则表达式(有限自动机)来完成吗?它不需要一个下推自动机吗 除了不交错外,请注意对单对的要求,这意味着嵌套可能只有一层深,具有不同的括号类型,如图所示 没有使用哪

在SO和其他地方有很多匹配括号或方括号对的解决方案,但我找不到或想出任何排除中间叶项目的方法。这一挑战的解决方案是什么:

为包含任意数量X的字符串编写正则表达式
以及<>和{}的单个对,它们可以嵌套,但不能嵌套
中间叶的。例如,允许使用以下字符串:
XXXX
X{X}XX{X}XX
但这些是不允许的:
XXXXX
XXXX}XX
这可以用正则表达式(有限自动机)来完成吗?它不需要一个下推自动机吗

除了不交错外,请注意对单对的要求,这意味着嵌套可能只有一层深,具有不同的括号类型,如图所示

没有使用哪个正则表达式引擎/语言的首选项。

使用

^[^{}]*(?:(?:{[^{}]*})+[^{}]*)*$

解释

--------------------------------------------------------------------------------
^字符串的开头
--------------------------------------------------------------------------------
[^{}]*除以下字符外的任何字符:''{','}'
(0次或以上(与最高金额匹配)
(可能的)
--------------------------------------------------------------------------------
(?:组,但不捕获(0次或更多次)
(匹配尽可能多的金额):
--------------------------------------------------------------------------------
(?:组,但不捕获(1个或多个)
次数(与最大金额匹配)
(可能的):
--------------------------------------------------------------------------------
<                        ''
--------------------------------------------------------------------------------
|或
--------------------------------------------------------------------------------
{                        '{'
--------------------------------------------------------------------------------
[^{}]*除“{”、“0”或“}”以外的任何字符
更多次(与最多金额匹配)
(可能的)
--------------------------------------------------------------------------------
}                        '}'
--------------------------------------------------------------------------------
)+分组结束
--------------------------------------------------------------------------------
[^{}]*除以下字符外的任何字符:''{','}'
(0次或更多次(匹配最大
(可能的金额)
--------------------------------------------------------------------------------
)*分组结束
--------------------------------------------------------------------------------
$在可选的前\n和
一串
使用

^[^{}]*(?:(?:{[^{}]*})+[^{}]*)*$

解释

--------------------------------------------------------------------------------
^字符串的开头
--------------------------------------------------------------------------------
[^{}]*除以下字符外的任何字符:''{','}'
(0次或以上(与最高金额匹配)
(可能的)
--------------------------------------------------------------------------------
(?:组,但不捕获(0次或更多次)
(匹配尽可能多的金额):
--------------------------------------------------------------------------------
(?:组,但不捕获(1个或多个)
次数(与最大金额匹配)
(可能的):
--------------------------------------------------------------------------------
<                        ''
--------------------------------------------------------------------------------
|或
--------------------------------------------------------------------------------
{                        '{'
--------------------------------------------------------------------------------
[^{}]*除“{”、“0”或“}”以外的任何字符
更多次(与最多金额匹配)
(可能的)
--------------------------------------------------------------------------------
}                        '}'
--------------------------------------------------------------------------------
)+分组结束
--------------------------------------------------------------------------------
[^{}]*除以下字符外的任何字符:''{','}'
(0次或更多次(匹配最大
(可能的金额)
--------------------------------------------------------------------------------
)*分组结束
--------------------------------------------------------------------------------
$在可选的前\n和
一串

X
成为
[^{}]
的简写。那么所需的正则表达式是:

(X |{(X |)*}*
或者,全部写出来

([^{}]|{([^{}]|)*})*

参见让
X
成为
[^{}]
的简写。那么所需的正则表达式是:

(X |{(X|