{"record":{"id":"668f52049dcf9f42","repo":"alibaba/nacos","slug":"400-668f52","errorCode":"400","errorMessage":"gray rule parse failed: raw rule[%s] doesn't match pattern[%s].","messagePattern":"gray rule parse failed: raw rule\\[(.+?)\\] doesn't match pattern\\[(.+?)\\]\\.","errorType":"validation","errorClass":"NacosException","httpStatus":null,"severity":"error","filePath":"config/src/main/java/com/alibaba/nacos/config/server/model/gray/singletag/SingleTagMatchGrayRule.java","lineNumber":64,"sourceCode":"    public SingleTagMatchGrayRule() {\n        super();\n    }\n    \n    public SingleTagMatchGrayRule(String rawGrayRuleExp, int priority) {\n        super(rawGrayRuleExp, priority);\n    }\n    \n    /**\n     * parse rule, accept key=value1,value2,value3.\n     *\n     * @param rawRule raw rule\n     */\n    @Override\n    protected void parse(String rawRule) throws NacosException {\n        this.isPatternMatch(rawRule, EXPRESSION_PATTERN);\n        String[] keyValueArray = rawRule.trim().split(EQUAL_PATTERN);\n        if (keyValueArray.length != KEY_VALUE_ARRAY_LENGTH) {\n            throw new NacosException(NacosException.INVALID_PARAM, String.format(\n                \"gray rule parse failed: raw rule[%s] doesn't match pattern[%s].\",\n                rawRule, KEY_PATTERN + EQUAL_PATTERN + VALUE_PATTERN));\n        }\n        isPatternMatch(keyValueArray[0].trim(), KEY_PATTERN);\n        isPatternMatch(keyValueArray[1].trim(), VALUE_PATTERN);\n        this.tagKey = keyValueArray[0].trim();\n        this.tagValueSet = Arrays.stream(keyValueArray[1].trim().split(VALUE_SPLITER_PATTERN))\n            .map(String::trim).filter(StringUtils::isNotBlank).collect(Collectors.toSet());\n    }\n    \n    @Override\n    public boolean match(Map<String, String> labels) {\n        if (labels.containsKey(tagKey) && tagValueSet.contains(labels.get(tagKey))) {\n            return true;\n        }\n        return false;\n    }\n    ","sourceCodeStart":46,"sourceCodeEnd":82,"githubUrl":"https://github.com/alibaba/nacos/blob/9b989acdf181d00898f2e8839257bb2b2a3cefe3/config/src/main/java/com/alibaba/nacos/config/server/model/gray/singletag/SingleTagMatchGrayRule.java#L46-L82","documentation":"Thrown by SingleTagMatchGrayRule.parse when the raw rule does not split into exactly 2 parts on '=' (keyValueArray.length != KEY_VALUE_ARRAY_LENGTH). Returns NacosException code 400 (INVALID_PARAM). Single-tag rules accept only 'key=value1,value2,value3' — no && or || operators.","triggerScenarios":"Submitting a single-tag grayRuleExp with no '=' or multiple '=', or attempting to use multi-tag operators (&&, ||) in a single-tag rule context.","commonSituations":"Wrong grayType selected (single-tag vs multi-tag); expression with operators intended for multi-tag; malformed key=value.","solutions":["For single-tag rules use exactly 'key=value' or 'key=v1,v2,v3' format with exactly one '='.","If you need AND/OR logic, use the multi-tag grayType instead.","Validate the expression has exactly one '=' before submitting."],"exampleFix":"// before\ngrayRuleExp = \"zone=us-east-1&&env=prod\"  // operators not allowed in single-tag\n// after (single-tag)\ngrayRuleExp = \"zone=us-east-1\"\n// or switch grayType to multi-tag for AND/OR","handlingStrategy":"validation","validationCode":"// Single-tag rule: exactly one '=' no && or ||\nString[] kv = rawRule.split(\"=\", -1);\nif (kv.length != 2 || rawRule.contains(\"&&\") || rawRule.contains(\"||\")) {\n    throw new IllegalArgumentException(\"invalid single-tag rule: \" + rawRule);\n}","typeGuard":null,"tryCatchPattern":"try { configApi.publishGray(form); }\ncatch (NacosException e) {\n    if (e.getErrCode() == NacosException.INVALID_PARAM)\n        { /* single-tag needs key=value only */ } else throw e;\n}","preventionTips":["Use single-tag rules only for one key=value (optionally comma-values).","Switch to multi-tag grayType for AND/OR logic."],"tags":["config","gray-release","tag-rule","singletag","validation","invalid-param"],"backgroundTag":null,"analyzedSha":"9b989acdf181d00898f2e8839257bb2b2a3cefe3","analyzedAt":"2026-08-14T07:17:31.569Z","schemaVersion":2},"datasetVersion":"2026-08-14T10:17:34.591Z"}