assert(isCorrect('') === true);
assert(isCorrect('()') === true);
assert(isCorrect('{()}') === true);
assert(isCorrect('{()}{}') === true);
assert(isCorrect('(())') === true);
assert(isCorrect('{({({({()})})})}') === true);
assert(isCorrect('{(})') === false);
这个我有preg_match的结果:
function isCorrect($source){
return (bool)preg_match('~^((\(([^)(}{]|(?1))*\))|\{(?3)*\})*$~', $source);
}
现在我只能通过preg_replace();
来做同样的事情答案 0 :(得分:1)
做递归可能有点棘手 当然,你必须单独考虑平衡对,否则它不起作用。
如果您只想要字符(){},那么这个。
# '~(\((?:(?>(?1))|)\)|\{(?:(?>(?1))|)\})~'
( # (1 start)
\(
(?:
(?> (?1) )
|
)
\)
|
\{
(?:
(?> (?1) )
|
)
\}
) # (1 end)
或者,如果您希望除了(){}之外的其他字符,那么这个。
# '~(\((?:(?>[^(){}]+)|(?1))*\)|\{(?:(?>[^(){}]+)|(?1))*\})~'
( # (1 start)
\(
(?:
(?> [^(){}]+ )
|
(?1)
)*
\)
|
\{
(?:
(?> [^(){}]+ )
|
(?1)
)*
\}
) # (1 end)
答案 1 :(得分:0)
^((\(([^)(}{]|(?1))*\))|\{(?3)*\})*$
是recursive模式from my comment yesterday ^
从$
开始到""
结束。
假设您要替换所有正确嵌套空字符串$str = preg_replace('~\(([^)(}{]|(?0))*\)|\{(?1)*\}~', "", $str);
的所有内容,请将其更改为:
{{1}}
checks if the string is composed of correctly nested ({}) / {()}; Test at regex101; Test at eval.in
请重新解释一下你的问题,如果不是这样的话,你会做什么。