RegEx BackReference для сопоставления различных значений
У меня есть регулярное выражение, которое я использую, чтобы соответствовать выражению формы(val1 operator val2)
Это регулярное выражение выглядит так:
(\(\s*([a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*(ni|in|\*|\/|\+|\-|==|!=|>|>=|<|<=)\s*([a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*\))
Что на самом деле хорошо и соответствует тому, что я хочу, как вы можете видетьздесь, в этой демонстрации
НО: D (вот масло)
Я хочу оптимизировать само регулярное выражение, сделав его более читабельным и «компактным». Я искал, как это сделать, и нашел что-то, называемое обратная ссылка, в которой вы можете назвать свои группы захвата и затем ссылаться на них позже как таковые:
(\(\s*(?P<Val>[a-zA-Z]+[0-9]*|[0-9]+|\'.*\'|\[.*\])\s*(ni|in|\*|\/|\+|\-|==|!=|>|>=|<|<=)\s*(\g{Val})\s*\))
где я назвал группу, которая захватывает левую часть выраженияVal
и позже я сослался на это как(\g{Val})
, теперьпроблема является то, что это выражение, как вы можете видетьВот Единственный случай, когда левая сторона выражения точно такая же, как правая сторона! например(a==a)
или же(1==1)
и не соответствует выражениям, таким как(a==b)
!
Теперь вопрос: есть ли способ ссылаться на шаблон вместо сопоставленного значения ?!