支架是平衡/匹配的

时间:2013-12-17 23:35:55

标签: sql sql-server regex matching brackets

我有一些MS Word文档,我已将整个内容传输到SQL表中。

内容包含许多方括号和大括号,例如

[{a} as at [b],] {c,} {d,} etc 

我需要检查以确保括号是平衡/匹配的,例如以下内容应返回false:

 - [{a} as at [b], {c,} {d,} 
 - ][{a} as at [b], {c,} {d,} 
 - [{a} as at [b],] {c,} }{d,

到目前为止我所做的是提取所有括号并将它们的信息存储到SQL表中,如下所示: (段落编号,支架类型,支架位置,支架级别)

3   [   8   1
3   ]   18  0
3   [   23  1
3   ]   35  0
7   [   97  1
7   ]   109 0
7   [   128 1
7   {   129 2
7   }   165 1
7   [   173 2
7   ]   187 1
7   ]   189 0
7   {   192 1
7   }   214 0
7   {   216 1
7   }   255 0
7   {   257 1
7   }   285 0
7   {   291 1
7   }   326 0
7   {   489 1
7   }   654 0

我不确定该算法将如何检查每个段落中的括号是否平衡,并在不是时给出错误消息。

任何建议都将不胜感激!

编辑:

代码也需要适用于以下场景;

(段落编号,支架类型,支架位置,支架水平)

15  [   543 1
15  {   544 2
15  }   556 1
15  [   560 2
15  ]   580 1
15  ]   581 0
15  [   610 1
15  ]   624 0
15  [   817 1
15  ]   829 0

3 个答案:

答案 0 :(得分:2)

这必须在sql server上吗?

一个简单的解决方案是使用通用语言并使用堆栈。

  • 逐个字符地读取字符串
  • 如果遇到开口支撑,请将其推入堆叠状态。
  • 如果遇到右大括号弹出。

如果

,则匹配所有括号
  • 完全读完段后,堆栈为空。

除非在此过程中发生以下其中一项

  • 你必须弹出一个空堆栈
  • 弹出的括号与右括号
  • 不匹配

使用正则表达式匹配括号不是一个好主意,它们不应该像那样使用

答案 1 :(得分:0)

我不确定您有哪些工具,但这是一个经过测试的JavaScript函数,它验证所有(可能是嵌套的)方括号和花括号是否正确匹配:

function isBalanced(text) {
    var re = /\[[^[\]{}]*\]|\{[^[\]{}]*\}/g;
    while (text.search(re) !== -1) { text = text.replace(re, ''); }
    return !(/[[\]{}]/.test(text))
}

它通过以迭代方式匹配和移除最内部平衡对来工作,直到没有更多匹配对为止。完成后,将进行测试以查看是否保留任何方括号或花括号。如果仍然存在,则该函数返回false,否则返回true。您应该能够以几乎任何语言实现此功能。

请注意,这假设方括号和大括号对不是交错的:[..{..]..}

希望这有帮助。

附录:扩展版:(),{},[]和<>

上述方法可以轻松扩展,以处理所有四种匹配括号类型的测试:(),{},[]和<>,如下所示:

/*#!(?#!js\/g re Rev:20150530_121324)
    # Innermost bracket matching pair from 4 global alternatives:
      \( [^(){}[\]<>]* \)  # Either g1of4. Innermost parentheses.
    | \{ [^(){}[\]<>]* \}  # Or g2of4. Innermost curly braces.
    | \[ [^(){}[\]<>]* \]  # Or g3of4. Innermost square brackets.
    | \< [^(){}[\]<>]* \>  # Or g4of4. Innermost angle brackets.
!#*/
function isBalanced(text) {
    var re = /\([^(){}[\]<>]*\)|\{[^(){}[\]<>]*\}|\[[^(){}[\]<>]*\]|\<[^(){}[\]<>]*\>/g;
    while (text.search(re) !== -1) { text = text.replace(re, ''); }
    return !(/[(){}[\]<>]/.test(text));
}

请注意,正则表达式已记录在扩展模式C注释中。

编辑20150530:扩展以处理所有四种匹配括号类型的混合:(),{},[]和&lt;&gt;。

答案 2 :(得分:0)

我同意用户mzzzzb。我一直致力于类似的编码挑战,并在JavaScript中提出以下解决方案:

function isBalanced(str) {
  const stack = [];
  const pairs = { ')': '(', ']': '[', '}': '{' };
  return str.split('').reduce((res, e) => {
    // if its opening, put in stack
    if (['(', '{', '['].includes(e)) stack.push(e);
    // if closing, compare thru stack
    else if ([')', '}', ']'].includes(e)) {
      if (stack.pop() !== pairs[e]) return false;
    }
    return res;
    // stack must also be empty
  }, true) && stack.length === 0;
}