{"record":{"id":"c73824adbd8754f4","repo":"alibaba/nacos","slug":"400-c73824","errorCode":"400","errorMessage":"tagv2 gray rule parse failed: key and value's[%s] doesn't match pattern[%s].","messagePattern":"tagv2 gray rule parse failed: key and value's\\[(.+?)\\] doesn't match pattern\\[(.+?)\\]\\.","errorType":"validation","errorClass":"NacosException","httpStatus":null,"severity":"error","filePath":"config/src/main/java/com/alibaba/nacos/config/server/model/gray/multitag/MultiTagMatchGrayRule.java","lineNumber":82,"sourceCode":"    protected void parse(String rawRule) throws NacosException {\n        this.isPatternMatch(rawRule, EXPRESSION_PATTERN);\n        String[] splitSubExpressionByOrArray = rawRule.trim()\n            .split(MultiTagMatchGrayRule.TagV2GrayRuleJoint.OR_REGEXP.getExpression());\n        for (String s : splitSubExpressionByOrArray) {\n            if (StringUtils.isBlank(s)) {\n                continue;\n            }\n            //each subExpression is jointed by one or multi \"&&\"\n            String[] splitSubExpressionByAndArray = s.trim()\n                .split(MultiTagMatchGrayRule.TagV2GrayRuleJoint.AND_REGEXP.getExpression());\n            for (int andIndex = 0; andIndex < splitSubExpressionByAndArray.length; andIndex++) {\n                if (StringUtils.isBlank(splitSubExpressionByAndArray[andIndex])) {\n                    continue;\n                }\n                String[] keyValueArray =\n                    splitSubExpressionByAndArray[andIndex].trim().split(EQUAL_PATTERN);\n                if (keyValueArray.length != 2) {\n                    throw new NacosException(NacosException.INVALID_PARAM, String.format(\n                        \"tagv2 gray rule parse failed: key and value's[%s] doesn't match pattern[%s].\",\n                        splitSubExpressionByAndArray[andIndex],\n                        KEY_PATTERN + EQUAL_PATTERN + VALUE_PATTERN));\n                }\n                isPatternMatch(keyValueArray[0].trim(), KEY_PATTERN);\n                isPatternMatch(keyValueArray[1].trim(), VALUE_PATTERN);\n                Set<String> values =\n                    Arrays.stream(keyValueArray[1].split(VALUE_SPLITER_PATTERN)).map(String::trim)\n                        .filter(StringUtils::isNotBlank).collect(Collectors.toSet());\n                MultiTagMatchGrayRule.TagV2GrayRuleItem tagV2GrayRuleItem =\n                    new MultiTagMatchGrayRule.TagV2GrayRuleItem(\n                        keyValueArray[0].trim(), values);\n                if (andIndex == 0) {\n                    tagV2GrayRuleItem.setJoint(MultiTagMatchGrayRule.TagV2GrayRuleJoint.OR);\n                }\n                if (this.ruleItems == null) {\n                    this.ruleItems = new ArrayList<>();\n                }","sourceCodeStart":64,"sourceCodeEnd":100,"githubUrl":"https://github.com/alibaba/nacos/blob/9b989acdf181d00898f2e8839257bb2b2a3cefe3/config/src/main/java/com/alibaba/nacos/config/server/model/gray/multitag/MultiTagMatchGrayRule.java#L64-L100","documentation":"Thrown by MultiTagMatchGrayRule.parse when a sub-expression (after splitting on || and &&) does not contain exactly one '=' separator (keyValueArray.length != 2). Returns NacosException code 400 (INVALID_PARAM). This is a structural error in a multi-tag gray rule expression, distinct from the regex-pattern error 834.","triggerScenarios":"Submitting a multi-tag grayRuleExp where one segment has no '=' (e.g. 'keyonly&&k2=v2') or more than one '=' (e.g. 'a=b=c'). The overall EXPRESSION_PATTERN may pass but the split-by-'=' produces != 2 parts.","commonSituations":"Building complex multi-tag expressions programmatically with a missing or duplicated '='; concatenating keys without values; using '==' or '!=' instead of '='.","solutions":["Ensure every key=value segment in the multi-tag expression has exactly one '='.","Join multiple conditions with '&&' (AND) or '||' (OR), and separate values within a key with commas."],"exampleFix":"// before\ngrayRuleExp = \"zone&&env=prod\"  // 'zone' has no value\n// after\ngrayRuleExp = \"zone=us-east-1&&env=prod\"","handlingStrategy":"validation","validationCode":"// Validate multi-tag rule: each segment must have exactly one '='\nfor (String seg : grayRuleExp.split(\"\\\\|\\\\||&&\")) {\n    seg = seg.trim();\n    if (seg.isEmpty()) continue;\n    String[] kv = seg.split(\"=\", -1);\n    if (kv.length != 2) throw new IllegalArgumentException(\"bad segment: \" + seg);\n}","typeGuard":null,"tryCatchPattern":"try { configApi.publishGray(form); }\ncatch (NacosException e) {\n    if (e.getErrCode() == NacosException.INVALID_PARAM)\n        { /* each segment needs exactly one '=' */ } else throw e;\n}","preventionTips":["Ensure each key=value segment in multi-tag rules has exactly one '='.","Join segments with && or ||, values with commas."],"tags":["config","gray-release","tag-rule","multitag","validation","invalid-param"],"backgroundTag":null,"analyzedSha":"9b989acdf181d00898f2e8839257bb2b2a3cefe3","analyzedAt":"2026-08-14T07:17:31.569Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}