Regex compilation errors#

Every diagnostic on this page comes from the pattern compiler. A regular expression is compiled before it runs, and a malformed pattern dies at that point - before the match is ever attempted. The errors are all fatal (F); trap them with eval if you build patterns from untrusted input:

my $re = eval { qr/$user_pattern/ };
die "bad pattern: $@" unless $re;

Upstream Perl appends a marked by <-- HERE in m/.../ suffix that points at the offending position. PetaPerl reports the same errors; the exact position-marker formatting may differ.

Common structural errors#

`Unmatched ) in regex`#

(F) A ) in the pattern has no matching (. Usually a typo or an unescaped literal parenthesis. To match a literal ), escape it as \) or put it in a character class [)].

`Quantifier follows nothing in regex`#

(F) A quantifier (*, +, ?, {n,m}) appeared with nothing in front of it to repeat - for example /*abc/ or /(?:)+/ on an empty group. Quantify a literal * by escaping it: /\*/.

`Unterminated group`#

(F) A ( opened a group that the pattern never closes. Balance the parentheses.

`Unterminated character class`#

(F) A [ opened a character class with no closing ]. To match a literal ], place it first in the class ([]x]) or escape it ([\]x]).

`Unterminated comment group`#

(F) A (?#...) comment group was opened but not closed with ).

`Unterminated conditional pattern`#

(F) A (?(condition)yes|no) construct was left unclosed.

`Unterminated group name`#

(F) A named-group construct ((?<name>...), \k<name>) ran to the end of the pattern without closing its name delimiter.

`Unrecognized group type`#

(F) The characters after (? do not form a group type PetaPerl knows. Check the (?...) spelling against the regex reference.

`Unexpected end of character class`#

(F) The pattern ended in the middle of a [...] class.

`Unexpected end of escape sequence`#

(F) A backslash escape was cut off by the end of the pattern.

Character-class and range errors#

`Invalid [] range "%s" in regex`#

(F) A character range inside [...] runs backwards (high to low), as in [z-a]. Order the endpoints low to high, or escape the - to match it literally.

`Invalid range endpoint in character class`#

(F) One end of a - range is not a single character (for example a multi-character escape used as an endpoint).

`POSIX class [:%s:] unknown`#

(F) A [:name:] POSIX class names a class that does not exist. The valid names are alpha, digit, alnum, space, upper, lower, punct, print, graph, cntrl, xdigit, blank, word, and ascii. A bare [:alpha:] outside another [...] is also an error - POSIX classes only work inside a character class: [[:alpha:]].

`Empty POSIX character class name`#

(F) A [::] with nothing between the colons.

Control-character and numeric escapes#

`Missing control char`#

(F) A \c escape was not followed by the character it should control, as in a pattern ending in \c.

`Missing control character after \c`#

(F) Same cause as above, from a different point in the compiler: \c needs one following character.

`Invalid control character '\c%s'`#

(F) The character after \c is not one \c accepts.

`Invalid octal escape`#

(F) A \0/\o octal escape is malformed.

`Invalid octal digit in \o{}`#

(F) A digit inside \o{...} is not 0–7.

`Expected '{' after \o`#

(F) \o must be followed by {, as in \o{17}.

`Expected '}' in \o{} and `Invalid Unicode code point in \o{}`#

(F) A \o{...} escape is unterminated or names a code point outside the valid range.

`Invalid hex escape` / `Invalid hex digit` / `Expected '}' in hex escape`#

(F) A \x escape is malformed: a non-hex digit, or an unterminated \x{...}.

\g, \k, and group references#

`\g0 is not allowed` and `\g{0} is not allowed`#

(F) Group 0 is the whole match and cannot be back-referenced. Reference a real capture group (\g1, \g{name}).

`Invalid group number in \g` / `Invalid group number in \g{}`#

(F) The number after \g is not a valid group reference.

`Expected digit or '{' after \g` / `Expected '}' after \g{`#

(F) \g must be followed by a digit, a sign, or {name}.

`Reference to nonexistent group number %d`#

(F) A \g/\1-style back-reference names a group number the pattern does not contain.

`Reference to nonexistent group (relative offset %d)`#

(F) A relative back-reference (\g{-2}) points past the groups that exist.

`Reference to nonexistent named group '%s'`#

(F) A \k<name> or \g{name} references a named group that was never defined.

`Reference to nonexistent or invalid group`#

(F) A group reference could not be resolved to any group.

`Expected '<' or '\'' after \k` / `Expected '}' after \k{`#

(F) A named back-reference \k must be written \k<name>, \k'name', or \k{name}.

Named groups#

`Empty group name`#

(F) A named group (?<>...) or reference has empty name brackets.

`Group name must not start with a digit`#

(F) Group names follow identifier rules; they may not begin with a digit.

\N and Unicode escapes#

`\N in character class requires braces`#

(F) Inside [...], \N must be written \N{...}; the bare “any non-newline” form is not allowed in a class.

`\N{NAME} not supported in character class`#

(F) A named-character \N{NAME} escape is not permitted inside a character class.

`Expected '}' after \N{` / `Empty \N{U+} escape`#

(F) A \N{...} escape is unterminated or \N{U+} has no hex digits.

`Invalid hex in \N{U+...}` / `Invalid Unicode code point in \N{U+...}`#

(F) The hex inside \N{U+...} is malformed or names a code point outside the Unicode range.

`Invalid Unicode code point`#

(F) A code-point escape names a value above the Unicode maximum (0x10FFFF).

`Empty Unicode property name` / `Unknown Unicode property name`#

(F) A \p{...} / \P{...} property escape is empty or names a property PetaPerl does not recognize.

(?...) extended constructs#

`Invalid flag after (?^` / `Invalid flag character`#

(F) A flag-setting group (?flags) or (?^flags:...) contains a character that is not a valid pattern modifier.

`Expected '{' after (??`#

(F) A (??{ code }) postponed-subpattern construct is malformed.

`Expected '<', '=', or '>' after (?P`#

(F) The Python-style (?P<name>...) / (?P=name) / (?P>name) construct is malformed.

`Expected DEFINE after (?(` / `Expected ')' after DEFINE`#

(F) A (?(DEFINE)...) block is malformed.

`Switch condition not recognized in regex` / `Invalid lookaround condition`#

(F) The condition in a (?(...)...) conditional is not a recognized form (a group number, a lookaround, R, or DEFINE).

`Expected ')' after condition` family#

(F) A conditional construct’s condition was not closed with ). The variants - `Expected ')' after (?(R...)`, `Expected ')' after code block condition`, `Expected ')' after lookahead condition`, `Expected ')' after lookbehind condition`, `Expected '=' or '!' after (?(<` - all report the same shape of error at different condition types.

Quantifier braces#

`Expected '}' after quantifier` / `Expected '}' or ',' in quantifier`#

(F) A {n,m} quantifier is unterminated or contains an unexpected character.

Lookbehind#

`Variable length lookbehind not implemented`#

(F) A lookbehind (?<=...) / (?<!...) whose contents can match a variable number of characters. PetaPerl, like upstream Perl, requires fixed-length lookbehind. Rewrite the lookbehind to a fixed width, or use \K to mark a keep-point instead.

Verbs#

`Unterminated verb`#

(F) A control verb (*VERB) / (*VERB:ARG) was not closed.

Catch-all#

`Regex compilation error at position %d: %s` / `Regular expression error`#

(F) A position-tagged compile error for cases the more specific messages above do not cover. The trailing text names the underlying problem.

`Unterminated string in %s`#

(F) A delimited construct inside the pattern ran to the end of input without its closing delimiter.

See also#

  • qr - precompile a pattern so a malformed one fails once, at compile time, instead of on every match.

  • m - the match operator; the same compiler rejects a malformed pattern here.

  • s - the substitution operator, whose pattern half is compiled by the same engine.

  • Warnings - the non-fatal regex diagnostics (Useless use of \E, Invalid character in group name).