{"record":{"id":"74b2c2f8e52fd21e","repo":"bazelbuild/bazel","slug":"not-a-valid-regular-expression-e-getmessage","errorCode":null,"errorMessage":"Not a valid regular expression: \" + e.getMessage()","messagePattern":"Not a valid regular expression: \" \\+ e\\.getMessage\\(\\)","errorType":"validation","errorClass":"OptionsParsingException","httpStatus":null,"severity":"error","filePath":"src/main/java/com/google/devtools/common/options/Converters.java","lineNumber":447,"sourceCode":"      throw new OptionsParsingException(\"Not one of \" + values);\n    }\n\n    @Override\n    public String getTypeDescription() {\n      return joinEnglishList(values);\n    }\n  }\n\n  /** Checks whether a string is a valid regex pattern and compiles it. */\n  public static class RegexPatternConverter extends Converter.Contextless<RegexPatternOption> {\n\n    @Override\n    public RegexPatternOption convert(String input) throws OptionsParsingException {\n      try {\n        return RegexPatternOption.create(\n            Pattern.compile(StringEncoding.internalToUnicode(input), Pattern.DOTALL));\n      } catch (PatternSyntaxException e) {\n        throw new OptionsParsingException(\"Not a valid regular expression: \" + e.getMessage());\n      }\n    }\n\n    @Override\n    public String getTypeDescription() {\n      return \"a valid Java regular expression\";\n    }\n  }\n\n  /** Checks whether an integer is in the given range. */\n  public static class RangeConverter extends Converter.Contextless<Integer> {\n    final int minValue;\n    final int maxValue;\n\n    public RangeConverter(int minValue, int maxValue) {\n      this.minValue = minValue;\n      this.maxValue = maxValue;\n    }","sourceCodeStart":429,"sourceCodeEnd":465,"githubUrl":"https://github.com/bazelbuild/bazel/blob/e6e199d0601a244511b4cf18c8b2828aa73db1fd/src/main/java/com/google/devtools/common/options/Converters.java#L429-L465","documentation":"Thrown by Converters.RegexPatternConverter.convert when Pattern.compile() rejects the input (after StringEncoding.internalToUnicode unescaping) with a PatternSyntaxException. The converter exists to fail fast at option-parsing time so an invalid regular expression never reaches the code that uses it; the message embeds the underlying Java regex error and position.","triggerScenarios":"Passing --test_filter=Foo( to an option using RegexPatternConverter; unmatched brackets/parens, dangling backslashes, invalid escapes like \\y, or malformed repetition like a{2,1}.","commonSituations":"Method filters with unescaped regex metacharacters (MyTest.test[1]); backslash handling lost through shell quoting; patterns written for a different regex dialect (Perl/POSIX) using unsupported syntax.","solutions":["Fix the regex per the PatternSyntaxException detail in the message (it names the index of the problem).","Escape literal metacharacters: MyTest\\.test\\[1\\].","Test the pattern in isolation first: jshell> Pattern.compile(args[0]).","Mind shell quoting: use single quotes so backslashes survive to Java."],"exampleFix":"# before\nbazel test --test_filter='MyTest.test[1]' //...\n# after\nbazel test --test_filter='MyTest\\.test\\[1\\]' //...","handlingStrategy":"validation","validationCode":"boolean isParsableRegex(String s) {\n  if (s == null) return false;\n  try { Pattern.compile(s, Pattern.DOTALL); return true; }\n  catch (PatternSyntaxException e) { return false; }\n}","typeGuard":"boolean isValidRegexFlagValue(String s) {\n  if (s == null || s.isEmpty()) return false;\n  try { java.util.regex.Pattern.compile(s, java.util.regex.Pattern.DOTALL); return true; }\n  catch (java.util.regex.PatternSyntaxException e) { return false; }\n}","tryCatchPattern":"try {\n  RegexPatternOption p = new Converters.RegexPatternConverter().convert(input);\n} catch (OptionsParsingException e) {\n  // e.getMessage() carries the PatternSyntaxException detail; surface it to the user verbatim\n}","preventionTips":["Compile patterns with jshell/Pattern.compile before putting them in flags.","Escape regex metacharacters in identifiers: . [ ] ( ) are literals to escape.","Single-quote regex flags in shells so backslashes reach Java intact."],"tags":["bazel","options","converter","regex","cli"],"backgroundTag":null,"analyzedSha":"e6e199d0601a244511b4cf18c8b2828aa73db1fd","analyzedAt":"2026-08-14T10:24:27.848Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}