在Notepad++中用正则匹配CREATE TABLE至CREATE OR REPLACE前的内容
匹配CREATE TABLE至CREATE OR REPLACE前内容的正则方案
问题背景
现有如下SQL内容:
CREATE TABLE "abc01"."SLI_EDF_INSTR" ( "EDF_INSTR_KEY" NUMBER(10,0) NOT NULL ENABLE, "EDF_KEY" NUMBER(10,0) NOT NULL ENABLE, "INSTR_KEY" NUMBER(10,0) NOT NULL ENABLE, "LAST_REC_TXN_USER_ID" VARCHAR2(32 BYTE) NOT NULL ENABLE, "LAST_REC_TXN_TYPE_CODE" VARCHAR2(1 BYTE) NOT NULL ENABLE, "LAST_REC_TXN_DATE" TIMESTAMP (6) NOT NULL ENABLE, "LAST_REC_TXN_USER_POST_NAME" VARCHAR2(60 BYTE) NOT NULL ENABLE); CREATE OR REPLACE EDITIONABLE TRIGGER "abc01"."TRG_SLEI_BIU" BEFORE INSERT OR UPDATE ON SLI_EDF_INSTR FOR EACH ROW DECLARE post_name VARCHAR2(32); BEGIN IF :NEW.LAST_REC_TXN_USER_ID IS NULL THEN :NEW.LAST_REC_TXN_USER_ID := 'SYSTEM'; END IF; IF :NEW.LAST_REC_TXN_DATE IS NULL OR UPDATING THEN :NEW.LAST_REC_TXN_DATE := SYSTIMESTAMP; END IF; IF :NEW.LAST_REC_TXN_USER_POST_NAME IS NULL THEN SELECT NVL(MAX(USER_POST_NAME), 'SYSTEM') INTO post_name FROM UAC_USER WHERE UPPER(TRIM(USER_ID)) = UPPER(TRIM(:NEW.LAST_REC_TXN_USER_ID)); :NEW.LAST_REC_TXN_USER_POST_NAME := post_name; END IF; IF INSERTING THEN :NEW.LAST_REC_TXN_TYPE_CODE := 'I'; ELSIF UPDATING THEN IF :NEW.LAST_REC_TXN_TYPE_CODE <> 'D' OR :NEW.LAST_REC_TXN_TYPE_CODE IS NULL THEN :NEW.LAST_REC_TXN_TYPE_CODE := 'U'; END IF; END IF; END;
需求是匹配从CREATE TABLE开始,到CREATE OR REPLACE之前的所有内容(不包含CREATE OR REPLACE部分),期望匹配结果如下:
CREATE TABLE "abc01"."SLI_EDF_INSTR" ( "EDF_INSTR_KEY" NUMBER(10,0) NOT NULL ENABLE, "EDF_KEY" NUMBER(10,0) NOT NULL ENABLE, "INSTR_KEY" NUMBER(10,0) NOT NULL ENABLE, "LAST_REC_TXN_USER_ID" VARCHAR2(32 BYTE) NOT NULL ENABLE, "LAST_REC_TXN_TYPE_CODE" VARCHAR2(1 BYTE) NOT NULL ENABLE, "LAST_REC_TXN_DATE" TIMESTAMP (6) NOT NULL ENABLE, "LAST_REC_TXN_USER_POST_NAME" VARCHAR2(60 BYTE) NOT NULL ENABLE);
之前使用正则CREATE TABLE.+(?![CREATE OR REPLACE])时,因开启了. matches newline,+的贪婪匹配会直接拉到文本末尾,且反向断言写法错误,导致匹配了全部内容,无法达到预期。
正确正则表达式
使用以下正则即可实现需求:
CREATE TABLE.*?(?=CREATE OR REPLACE)
规则说明
.*?:非贪婪模式的任意字符匹配(因勾选了. matches newline,所以包含换行符),会尽可能少地匹配内容,直到触发后续断言条件就停止。(?=CREATE OR REPLACE):正向零宽断言,用于定位到CREATE OR REPLACE的起始位置,不会将该字符串包含在匹配结果中。
操作步骤
- 打开Notepad++并加载目标SQL文件;
- 按下
Ctrl+F打开查找对话框,切换到Regular expression模式; - 勾选**. matches newline**选项;
- 在查找框中输入上述正则表达式,点击查找即可匹配到目标内容。
内容的提问来源于stack exchange,提问作者user1169587
相关产品推荐
相关产品推荐

