我正在编辑一个用于SQL的TextMate语法。它目前具有以下正则表达式(为了清晰起见,忽略了关键字):
(?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
但是为什么之前没有匹配成功呢?我本来以为会匹配成功,但是可能会给我一个意料之外的捕获组(如果外部被动组指示器没有继续传递到新的内部组)。