求提取SGF节点键值对的JavaScript/TypeScript正则表达式
提取SGF节点键值对的JavaScript/TypeScript正则方案
需求说明
SGF节点内数据以「键[值]」的连续键值对形式存储,键长度无固定限制(常见为2字符),值可包含特殊字符(如版本号里的冒号、日期里的横杠等),落子格式为B[坐标]或W[坐标],需要匹配所有合法键值对并转换为键值对象。
核心正则表达式
const sgfKVRegex = /([^\[\]]+)\[([^\]]*)\]/g;
匹配逻辑拆解
([^\[\]]+):捕获键部分,匹配所有非方括号的字符,支持任意长度的键(如GM、B、AP都能命中)\[:匹配左方括号(转义是因为方括号在正则中属于特殊语法字符)([^\]]*):捕获值部分,匹配左括号后到右括号前的所有内容,兼容空值、含特殊字符的值\]:匹配右方括号g:全局修饰符,用于遍历字符串中所有符合规则的键值对
实战使用示例(TypeScript)
const sgfNodeContent = `GM[1]FF[4]CA[UTF-8]AP[Sabaki:0.52.2]KM[6.5]SZ[19]DT[2023-12-25]B[aa]W[bb]`; const sgfKVRegex = /([^\[\]]+)\[([^\]]*)\]/g; const kvObject: Record<string, string> = {}; let matchResult; while ((matchResult = sgfKVRegex.exec(sgfNodeContent)) !== null) { const [_, key, value] = matchResult; kvObject[key] = value; } console.log(kvObject); // 输出: // { // GM: '1', // FF: '4', // CA: 'UTF-8', // AP: 'Sabaki:0.52.2', // KM: '6.5', // SZ: '19', // DT: '2023-12-25', // B: 'aa', // W: 'bb' // }
特殊场景兼容
如果值中存在转义的右括号(如\]),需要使用兼容转义的正则:
const sgfKVWithEscapeRegex = /([^\[\]]+)\[((?:\\]|[^\]])*)\]/g;
内容的提问来源于stack exchange,提问作者psygo
相关产品推荐
相关产品推荐

