如何在Notepad++中用正则替换指定[]为()(含场景排除)
在Notepad++中用正则表达式精准替换二维数组的[]为()
需求场景
需将代码中二维数组形式的方括号替换为圆括号,具体匹配规则:
- 匹配并替换的示例:
abc[1, 2];→abc(1, 2);abc[EDGE, 2];→abc(EDGE, 2);abc[EDGE, otherArray[1]];→abc(EDGE, otherArray[1]);abc[array[VERT], other[INDEX]];→abc(array[VERT], other[INDEX]);
排除场景
以下情况需完全忽略,不执行替换:
- 方括号内仅单个元素:
abc[1];、abc[index]; - 方括号内有三个及以上元素:
abc[1, 2, 3];、abc[otherArray[EDGE], 2, 8];
问题重现
此前的正则方案存在误匹配,会错误修改单元素数组(如示例中的test[0]),错误场景代码:
if (test[0]) { triangles.push_back(tris[i, V1]); // 之前的方案误处理了上方的'test[0]' triangles.push_back(tris[i, V2]); triangles.push_back(tris[i, V3]); }
解决方案
操作步骤
- 打开Notepad++,按
Ctrl+H调出替换窗口 - 勾选「正则表达式」选项,取消「.匹配换行符」的勾选
- 填入以下正则规则:
- 查找模式:
(\w+)\[(?=(?:[^,\[\]]|(?R))*,\s*(?:[^,\[\]]|(?R))*])(?!.*,\s.*,)((?:[^[\]]|(?R))*)\] - 替换为:
$1($2)
- 查找模式:
- 点击「全部替换」完成批量修改
正则规则说明
(\w+):捕获数组标识符(由字母、数字、下划线组成的变量名)\[:匹配左方括号(?=(?:[^,\[\]]|(?R))*,\s*(?:[^,\[\]]|(?R))*]):正向预查,确保方括号内包含至少一个逗号且嵌套括号平衡(?!.*,\s.*,):负向预查,确保方括号内仅存在一个逗号(排除多元素数组)((?:[^[\]]|(?R))*):捕获方括号内的完整内容(支持嵌套数组结构)\]:匹配右方括号
内容的提问来源于stack exchange,提问作者21k
相关产品推荐
相关产品推荐

