需求:匹配无括号或平衡括号的正则表达式(修正返回逻辑)
解决无括号或平衡括号的字符串校验问题
要满足「无任何括号」或「包含平衡括号」的校验需求,可以使用支持递归的正则表达式(ES2018及以上版本JavaScript支持),同时覆盖两种场景:
const reg = /^(?:[^()]|\((?:[^()]|(?R))*\))*$/;
正则说明
^和$:锁定整个字符串的首尾,避免只匹配部分内容(?:[^()]|\((?:[^()]|(?R))*\))*:重复匹配以下两种内容任意次数:[^()]:任意非括号字符\((?:[^()]|(?R))*\):平衡的括号结构,其中(?R)递归调用整个正则,支持嵌套括号(比如(a(b)c)这类场景)
修正后的测试代码
function func(str) { const reg = /^(?:[^()]|\((?:[^()]|(?R))*\))*$/; console.log(`测试字符串: "${str}"`); console.log(`校验结果: ${reg.test(str)}`); console.log(`匹配内容: ${str.match(reg) ? str.match(reg)[0] : '无匹配'}`); console.log('---'); } func("33"); // 无括号 → 返回true func("1(1)6"); // 平衡括号 → 返回true func("11)6"); // 不平衡括号 → 返回false func("(a(b)c)"); // 嵌套平衡括号 → 返回true func("((a)"); // 多余左括号 → 返回false func("a)b(c)"); // 多余右括号 → 返回false
测试结果说明
"33":无任何括号,校验通过"1(1)6":括号成对出现,校验通过"11)6":存在单独的右括号,校验失败"((a)":左括号未闭合,校验失败"a)b(c)":右括号无对应左括号,校验失败
内容的提问来源于stack exchange,提问作者Maan Ch
相关产品推荐
相关产品推荐

