{"record":{"id":"ed6a15c27dfbb614","repo":"languagetool-org/languagetool","slug":"rule-error-cannot-replace-or-filter-more-than-on","errorCode":null,"errorMessage":" rule error. Cannot replace or filter more than one token at a time.\" + \"\\n Line: \" + pLocator.getLineNumber() + \", column: \" + pLocator.getColumnNumber() + \".","messagePattern":" rule error\\. Cannot replace or filter more than one token at a time\\.\" \\+ \"\\\\n Line: \" \\+ pLocator\\.getLineNumber\\(\\) \\+ \", column: \" \\+ pLocator\\.getColumnNumber\\(\\) \\+ \"\\.","errorType":"exception","errorClass":"SAXException","httpStatus":null,"severity":"error","filePath":"languagetool-core/src/main/java/org/languagetool/tagging/disambiguation/rules/DisambiguationRuleHandler.java","lineNumber":350,"sourceCode":"        setRuleFilter(filterClassName, filterArgs, rule);\n        if (!rulegroupAntiPatterns.isEmpty()) {\n          rule.setAntiPatterns(rulegroupAntiPatterns);\n        }\n        if (!ruleAntiPatterns.isEmpty()) {\n          rule.setAntiPatterns(ruleAntiPatterns);\n          ruleAntiPatterns.clear();\n        }\n        rules.add(rule);\n        if (disambigAction == DisambiguationPatternRule.DisambiguatorAction.UNIFY && matchedTokenCount != uniCounter) {\n          throw new SAXException(language.getName() + \" rule error. The number unified tokens: \"\n                  + uniCounter + \" must be equal to the number of matched tokens: \" + matchedTokenCount\n                  + \"\\n Line: \" + pLocator.getLineNumber() + \", column: \"\n                  + pLocator.getColumnNumber() + \".\");\n        }\n        boolean singleTokenCorrection = endPos - startPos > 1;\n        if ((!singleTokenCorrection && (disambigAction == DisambiguationPatternRule.DisambiguatorAction.FILTER || disambigAction == DisambiguationPatternRule.DisambiguatorAction.REPLACE))\n                && (matchedTokenCount > 1)) {\n          throw new SAXException(\n                  language.getName() + \" rule error. Cannot replace or filter more than one token at a time.\"\n                          + \"\\n Line: \" + pLocator.getLineNumber() + \", column: \"\n                          + pLocator.getColumnNumber() + \".\");\n        }\n        patternTokens.clear();\n        posSelector = null;\n        disambExamples = null;\n        untouchedExamples = null;\n        startPos = -1;\n        endPos = -1;\n        filterClassName = null;\n        filterArgs = null;\n        inRule = false;\n        break;\n      case EXCEPTION:\n        finalizeExceptions();\n        break;\n      case AND:","sourceCodeStart":332,"sourceCodeEnd":368,"githubUrl":"https://github.com/languagetool-org/languagetool/blob/2e990059ce67d5e2a0f7f7ca5d31160c6709df4b/languagetool-core/src/main/java/org/languagetool/tagging/disambiguation/rules/DisambiguationRuleHandler.java#L332-L368","documentation":"Guard for REPLACE/FILTER disambiguation actions: these actions operate on exactly one token, but the rule's pattern (after marker start/end corrections) matched more than one token. Fires at rule-group end while parsing the XML when a single-token action is paired with a multi-token match span.","triggerScenarios":"Thrown at languagetool-core/src/main/java/org/languagetool/tagging/disambiguation/rules/DisambiguationRuleHandler.java:350 when the library encounters an invalid state.","commonSituations":"See trigger scenarios.","solutions":["Reduce the pattern or marker span so exactly one token is matched for REPLACE/FILTER actions","Split the rule so each single-token action has its own rule","Use an action that supports multiple tokens if multi-token handling is intended"],"exampleFix":null,"handlingStrategy":"validation","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":[],"tags":[],"backgroundTag":null,"analyzedSha":"2e990059ce67d5e2a0f7f7ca5d31160c6709df4b","analyzedAt":"2026-09-06T09:20:17.015Z","contentChangedAt":"2026-09-06T09:20:17.015Z","schemaVersion":2},"datasetVersion":"2026-09-14T00:17:10.932Z"}