{"record":{"id":"aedfc53585783b75","repo":"karatelabs/karate","slug":"invalid-regular-expression","errorCode":null,"errorMessage":"Invalid regular expression: /","messagePattern":"Invalid regular expression: /","errorType":"exception","errorClass":"SyntaxError","httpStatus":null,"severity":"error","filePath":"karate-js/src/main/java/io/karatelabs/js/JsRegex.java","lineNumber":97,"sourceCode":"            this.pattern = literalText.substring(1, lastSlashIndex);\n            this.flags = lastSlashIndex < literalText.length() - 1\n                    ? literalText.substring(lastSlashIndex + 1)\n                    : \"\";\n        } else {\n            // string patterns without delimiters\n            this.pattern = literalText;\n            this.flags = \"\";\n        }\n        this.global = this.flags.contains(\"g\");\n        this.sticky = this.flags.contains(\"y\");\n        this.groupNames = extractGroupNames(this.pattern);\n        int javaFlags = translateJsFlags(this.flags);\n        try {\n            // unescape js-specific regex syntax that differs from Java\n            String javaPattern = translateJsRegexToJava(this.pattern);\n            this.javaPattern = Pattern.compile(javaPattern, javaFlags);\n        } catch (PatternSyntaxException e) {\n            throw JsErrorException.syntaxError(\"Invalid regular expression: /\" + pattern + \"/ - \" + e.getMessage());\n        }\n    }\n\n    JsRegex(String pattern, String flags) {\n        super(null, JsRegexPrototype.INSTANCE);\n        this.pattern = pattern;\n        this.flags = flags != null ? flags : \"\";\n        this.global = this.flags.contains(\"g\");\n        this.sticky = this.flags.contains(\"y\");\n        this.groupNames = extractGroupNames(this.pattern);\n        int javaFlags = translateJsFlags(this.flags);\n        try {\n            String javaPattern = translateJsRegexToJava(this.pattern);\n            this.javaPattern = Pattern.compile(javaPattern, javaFlags);\n        } catch (PatternSyntaxException e) {\n            throw JsErrorException.syntaxError(\"Invalid regular expression: /\" + pattern + \"/ - \" + e.getMessage());\n        }\n    }","sourceCodeStart":79,"sourceCodeEnd":115,"githubUrl":"https://github.com/karatelabs/karate/blob/a22eb90246d958d15a47bf436693d0121ad2812d/karate-js/src/main/java/io/karatelabs/js/JsRegex.java#L79-L115","documentation":"After translating the JS regex source to Java syntax, the pattern is compiled with java.util.regex.Pattern. If Pattern.compile raises PatternSyntaxException, a SyntaxError 'Invalid regular expression: /pattern/ - <detail>' is thrown. This means the pattern is syntactically invalid even after Karate's JS→Java translation (or the translation itself does not cover the construct used).","triggerScenarios":"Patterns with unbalanced parentheses or brackets, invalid quantifiers like /*/, invalid escapes like \\q, unterminated groups, or JS-only syntax (e.g. lookbehind forms, unicode property escapes \\p{...} without the u flag) that translate to something Java rejects.","commonSituations":"Dynamically building patterns from user input; copying a JS regex using lookbehind or named-group syntax variants into an older translation path; forgetting the 'u' flag for \\p{L}-style classes; hand-written patterns with an unmatched '('.","solutions":["Read the PatternSyntaxException detail appended to the message for the exact position/problem","Fix the pattern: balance parens/brackets, correct quantifiers and escapes","Validate the pattern with a quick try/catch around new RegExp(pattern) before using it","Drop or rewrite JS-only constructs (e.g. use ([A-Za-z]) instead of \\p{Alpha} when flags/translation do not support it)"],"exampleFix":"// before\nnew RegExp('a('); // unbalanced group -> PatternSyntaxException\n// after\nnew RegExp('a(bc)?'); // balanced, valid pattern","handlingStrategy":"validation","validationCode":"function isValidPattern(p) {\n  try { new RegExp(p); return true; } catch (e) { return false; }\n}\nif (!isValidPattern(pattern)) throw new Error('invalid regex: ' + pattern);","typeGuard":null,"tryCatchPattern":"try {\n  const re = new RegExp(pattern, flags);\n} catch (e) {\n  if (String(e.message).startsWith('Invalid regular expression')) {\n    log.warn('bad regex pattern: ' + pattern + ' :: ' + e.message);\n    return fallbackRegex;\n  }\n  throw e;\n}","preventionTips":["Validate dynamically built patterns at the point of construction","Balance parentheses/brackets and check quantifier placement in generated patterns","Prefer widely-supported constructs over JS-only syntax the translator may not cover","Test config/env-sourced patterns with a smoke compile at startup"],"tags":["javascript","regex","syntaxerror","pattern"],"backgroundTag":"invalid-regex-pattern","analyzedSha":"a22eb90246d958d15a47bf436693d0121ad2812d","analyzedAt":"2026-09-12T09:01:00.220Z","contentChangedAt":"2026-09-12T09:01:00.220Z","schemaVersion":2},"datasetVersion":"2026-09-16T19:17:19.609Z"}