Регулярное выражение с ? квантификатор внутри пассивной группы?

#ruby #regex #oniguruma

#ruby #регулярное выражение #онигурума

Вопрос:

Я редактирую грамматику TextMate для SQL. В настоящее время он содержит регулярное выражение (ключевые слова опущены для уточнения):

 (?i:^s*(create)s (aggregate|function|(uniques )?index|table)s )(['"`]?)(w )4
  

Это правильно соответствует определению функции, например

 CREATE FUNCTION similarity
  

Я хотел обработать CREATE OR REPLACE , поэтому я изменил регулярное выражение на

 (?i:^s*(create(s ors replace)?)s (aggregate|function|(uniques )?index|table)s )(['"`]?)(w )4
  

и это не будет соответствовать a CREATE или a CREATE OR REPLACE . Я исправил это, сделав новую необязательную группу пассивной:

 (?i:^s*(create(?i:s ors replace)?)s (aggregate|function|(uniques )?index|table)s )(['"`]?)(w )4
  

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

Ответ №1:

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