Regex с? квантификатор внутри пассивной группы? - PullRequest
4 голосов
/ 05 октября 2011

Я редактирую грамматику 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

Но ... почему она не совпадала раньше?Я ожидал, что он совпадет, но затем, возможно, даст мне группу захвата, которую я не ожидал (если внешний индикатор пассивной группы не опускается до новой внутренней группы).

1 Ответ

2 голосов
/ 05 октября 2011

Это был ваш \ 4 - вам нужно было изменить его на \ 5, когда вы впервые добавили новые парены.

...