{"id":"9c4c57888d8a6188","repo":"junit-team/junit5","slug":"pattern-compilation-failed-for-a-regular-expressio","errorCode":null,"errorMessage":"Pattern compilation failed for a regular expression supplied in ${enumSource}","messagePattern":"Pattern compilation failed for a regular expression supplied in (.+?)","errorType":"exception","errorClass":"PreconditionViolationException","httpStatus":null,"severity":"error","filePath":"junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider/EnumSource.java","lineNumber":228,"sourceCode":"\t\t\tPreconditions.notNull(constant, \"Enum constant must not be null\");\n\t\t\tPreconditions.notNull(names, \"names must not be null\");\n\n\t\t\treturn selector.test(constant.name(), names);\n\t\t}\n\n\t\tprivate static void validateNames(EnumSource enumSource, Set<? extends Enum<?>> constants, Set<String> names) {\n\t\t\tSet<String> allNames = constants.stream().map(Enum::name).collect(toSet());\n\t\t\tPreconditions.condition(allNames.containsAll(names),\n\t\t\t\t() -> \"Invalid enum constant name(s) in \" + enumSource + \". Valid names include: \" + allNames);\n\t\t}\n\n\t\tprivate static void validatePatterns(EnumSource enumSource, Set<? extends Enum<?>> constants,\n\t\t\t\tSet<String> names) {\n\t\t\ttry {\n\t\t\t\tnames.forEach(Pattern::compile);\n\t\t\t}\n\t\t\tcatch (PatternSyntaxException e) {\n\t\t\t\tthrow new PreconditionViolationException(\n\t\t\t\t\t\"Pattern compilation failed for a regular expression supplied in \" + enumSource, e);\n\t\t\t}\n\t\t}\n\n\t\tprivate interface Validator {\n\t\t\tvoid validate(EnumSource enumSource, Set<? extends Enum<?>> constants, Set<String> names);\n\t\t}\n\n\t}\n\n}\n","sourceCodeStart":210,"sourceCodeEnd":240,"githubUrl":"https://github.com/junit-team/junit5/blob/956246301e03d757539f7b76dd5a91f298637563/junit-jupiter-params/src/main/java/org/junit/jupiter/params/provider/EnumSource.java#L210-L240","documentation":"EnumSource.Mode.validatePatterns runs Pattern.compile on every entry of names when mode is MATCH_ALL, MATCH_ANY, or MATCH_NONE, and wraps PatternSyntaxException as PreconditionViolationException. At least one of the supplied regular expressions is malformed.","triggerScenarios":"@EnumSource(mode = Mode.MATCH_ALL, names = {\"...\"}) with an invalid regex such as an unbalanced bracket, dangling quantifier, or illegal escape.","commonSituations":"Forgetting to escape regex metacharacters; reusing a literal include-list as patterns; mismatched parentheses copied from documentation.","solutions":["Compile each pattern with Pattern.compile in a scratch test to find the offending entry.","Use Pattern.quote(s) (or \\Q...\\E) when you want literal matching.","Switch the mode to INCLUDE or EXCLUDE for exact name matching without regex semantics.","Fix the regex syntax (close brackets/parentheses, escape metacharacters)."],"exampleFix":"// before\n@EnumSource(mode = Mode.MATCH_ALL, names = { \"[A-Z\" })\n\n// after\n@EnumSource(mode = Mode.MATCH_ALL, names = { \"[A-Z]+\" })","handlingStrategy":"validation","validationCode":"// Pre-compile every @EnumSource pattern when using MATCH_* modes.\nString[] names = { \"[A-Z]+\" };\ntry {\n    for (String n : names) java.util.regex.Pattern.compile(n);\n} catch (java.util.regex.PatternSyntaxException e) {\n    throw new IllegalArgumentException(\"Invalid @EnumSource pattern: \" + e.getMessage(), e);\n}","typeGuard":null,"tryCatchPattern":"try {\n    // run the enum-source parameterized test\n} catch (PreconditionViolationException e) {\n    if (e.getMessage().contains(\"Pattern compilation failed\")) {\n        // fix the regex or switch mode to INCLUDE/EXCLUDE for literal names\n    } else throw e;\n}","preventionTips":["Compile patterns in a scratch test before declaring them in @EnumSource.","Use Pattern.quote for literals you do not want interpreted as regex.","Prefer Mode.INCLUDE/EXCLUDE unless regex matching is actually needed."],"tags":["junit","jupiter-params","enum-source","regex","parameterized-test"],"analyzedSha":"956246301e03d757539f7b76dd5a91f298637563","analyzedAt":"2026-08-04T19:25:17.049Z","schemaVersion":2}