Обратите внимание, что \g{N}
эквивалентно \1
, то есть backreference , который соответствует тому же значению , а не шаблону, который соответствует соответствующей группе захвата , Этот синтаксис немного более гибкий, поскольку вы можете определить группы захвата, которые относительны к текущей группе, используя -
перед номером (т.е. \g{-2}
, (\p{L})(\d)\g{-2}
будет соответствовать a1a
).
Механизм PCRE позволяет выполнять вызовы подпрограммы для рекурсии подшаблонов. Чтобы повторить шаблон группы 1, используйте (?1)
и (?&Val)
для повторения шаблона именованной группы Val
.
Кроме того, вы можете использовать классы символов для соответствия одиночным символам и рассмотреть используя ?
квантификатор, чтобы сделать части регулярного выражения необязательными:
(\(\s*(?P[a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*(ni|in|[*\/+-]|[=!><]=|[><])\s*((?&Val))\s*\))
См. демонстрацию regex
Обратите внимание, что \'.*\'
и \[.*\]
может слишком много совместить, подумайте о замене на \'[^\']*\'
и \[[^][]*\]
.