Note that \g{N}
is equivalent to \1
, that is, a backreference that matches the same value, not the pattern, that the corresponding capturing group matched. This syntax is a bit more flexible though, since you can define the capture groups that are relative to the current group by using -
before the number (i.e. \g{-2}
, (\p{L})(\d)\g{-2}
will match a1a
).
The PCRE engine allows subroutine calls to recurse subpatterns. To repeat the pattern of Group 1, use (?1)
, and (?&Val)
to recurse the pattern of the named group Val
.
Also, you may use character classes to match single characters, and consider using ?
quantifier to make parts of the regex optional:
(\(\s*(?P<Val>[a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*(ni|in|[*\/+-]|[=!><]=|[><])\s*((?&Val))\s*\))
See the regex demo
Note that \'.*\'
and \[.*\]
can match too much, consider replacing with \'[^\']*\'
and \[[^][]*\]
.