Я редактирую грамматику TextMate для SQL.В настоящее время он имеет регулярное выражение (ключевые слова опущены для пояснения):
(?i:^\s*(create)\s+(aggregate|function|(unique\s+)?index|table)\s+)(['"`]?)(\w+)\4
Это правильно соответствует определению функции, например
CREATE FUNCTION similarity
Я хотел обработать CREATE OR REPLACE
, поэтому я изменил регулярное выражениедо
(?i:^\s*(create(\s+or\s+replace)?)\s+(aggregate|function|(unique\s+)?index|table)\s+)(['"`]?)(\w+)\4
, и оно не будет соответствовать CREATE
или CREATE OR REPLACE
.Я исправил это, сделав новую необязательную группу пассивной:
(?i:^\s*(create(?i:\s+or\s+replace)?)\s+(aggregate|function|(unique\s+)?index|table)\s+)(['"`]?)(\w+)\4
Но ... почему она не совпадала раньше?Я ожидал, что он совпадет, но затем, возможно, даст мне группу захвата, которую я не ожидал (если внешний индикатор пассивной группы не опускается до новой внутренней группы).