我最近在一次面试中遇到了这个问题,我完全不好意思弄清楚。任务是找到一个算法,通过匹配的打开和关闭标记来查看字符串是否有效。因此:
"{This is [an example (of a) valid] string}"
{[()]}检查就是我们要找的。有什么帮助吗?我只能在foreach循环中找到基本的字符串匹配。如果$letter=="{"等,我们会在这里使用regex吗?
您需要的是一个堆栈。
遍历字符串,并在堆栈上推动左大括号。遇到右大括号时,从堆栈中弹出一个值,并检查它是否与左大括号匹配。在字符串的末尾,确保堆栈为空。您可以忽略介于两者之间的所有其他字符。
function isProperlyNested($string) {
$stack = [];
foreach (str_split($string) as $c) {
switch($c) {
case "(":
case "[":
case "{":
array_push($stack, $c);
break;
case ")":
if (array_pop($stack) != "(")
return false;
break;
case "]":
if (array_pop($stack) != "[")
return false;
break;
case "}":
if (array_pop($stack) != "{")
return false;
break;
}
}
return count($stack) == 0;
}
但是,如果您想要的是regex解决方案,那么。。。
^(?<p>(?:[^()'[']{}]++|'((?&p)')|'[(?&p)']|'{(?&p)'})*)$
这里有:)