{"record":{"id":"526a24d6cab72e88","repo":"apple/pkl","slug":"invalidglobinvalidcharacterincharacterclass","errorCode":"invalidGlobInvalidCharacterInCharacterClass","errorMessage":"invalidGlobInvalidCharacterInCharacterClass","messagePattern":"invalidGlobInvalidCharacterInCharacterClass","errorType":"error_code","errorClass":"InvalidGlobPatternException","httpStatus":null,"severity":"error","filePath":"pkl-core/src/main/java/org/pkl/core/util/GlobResolver.java","lineNumber":124,"sourceCode":"        sb.append(']');\n        i++;\n      }\n      case NULL ->\n          throw new InvalidGlobPatternException(\n              ErrorMessages.create(\"invalidGlobMissingCharacterClassTerminator\"));\n    }\n    i++;\n    var current = globPattern.charAt(i);\n    while (current != ']') {\n      if (current == '[') {\n        var next = getNextChar(globPattern, i);\n        if (next == ':' || next == '=' || next == '.') {\n          throw new InvalidGlobPatternException(\n              ErrorMessages.create(\"invalidGlobUnsupportedFeature\"));\n        }\n      }\n      if (current == '/') {\n        throw new InvalidGlobPatternException(\n            ErrorMessages.create(\"invalidGlobInvalidCharacterInCharacterClass\", current));\n      } else if (current == '\\\\') {\n        sb.append(\"\\\\\\\\\");\n      } else {\n        sb.append(current);\n      }\n      i++;\n      if (i == globPattern.length()) {\n        throw new InvalidGlobPatternException(\n            ErrorMessages.create(\"invalidGlobMissingCharacterClassTerminator\"));\n      }\n      current = globPattern.charAt(i);\n    }\n    sb.append(\"]]\");\n    return i;\n  }\n\n  public static Pattern toRegexPattern(String globPattern) throws InvalidGlobPatternException {","sourceCodeStart":106,"sourceCodeEnd":142,"githubUrl":"https://github.com/apple/pkl/blob/f3efcbfc9b60d30053b0536d664948d7aa1b8673/pkl-core/src/main/java/org/pkl/core/util/GlobResolver.java#L106-L142","documentation":"A glob character class `[...]` must not contain `/` because character classes match a single path component and cannot cross directory boundaries. consumeCharacterClass throws InvalidGlobPatternException with this code when `/` appears inside a class.","triggerScenarios":"Writing a glob like `src/[a/b].pkl` or `**/[ab/c]` — any `/` between an opening `[` and its closing `]` passed to GlobResolver.toRegexString/toRegexPattern.","commonSituations":"Trying to match either of two directory paths inside a class; misunderstanding that `[a/b]` means 'a or b directory'; hand-editing patterns and accidentally inserting a slash.","solutions":["Remove `/` from the character class; move path separators outside the class (e.g. `[ab]/c` instead of `[a/b]/c`).","Use a `{a,b}` alternation group to match alternative path segments.","Split the pattern into separate globs if needed."],"exampleFix":"// before\nglob = \"[a/b]/config.pkl\"\n// after\nglob = \"{a,b}/config.pkl\"","handlingStrategy":"validation","validationCode":"java.util.regex.Matcher m = java.util.regex.Pattern.compile(\"\\\\[[^\\\\]]*/[^\\\\]]*\\\\]\").matcher(glob);\nif (m.find()) throw new IllegalArgumentException(\"'/' not allowed inside glob character class\");\n","typeGuard":null,"tryCatchPattern":"try { return GlobResolver.toRegexPattern(glob); } catch (InvalidGlobPatternException e) { throw new IllegalArgumentException(\"Invalid character class in: \" + glob, e); }\n","preventionTips":["Keep `/` outside character classes.","Use {a,b} alternation for alternative path segments.","Review hand-edited patterns for stray slashes."],"tags":["pkl","glob","pattern","validation"],"backgroundTag":"invalid-regex-pattern","analyzedSha":"f3efcbfc9b60d30053b0536d664948d7aa1b8673","analyzedAt":"2026-09-08T13:10:45.570Z","contentChangedAt":"2026-09-08T13:10:45.570Z","schemaVersion":2},"datasetVersion":"2026-09-14T16:17:12.679Z"}