我有一些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
答案 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;
}