You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在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)

规则说明

  1. .*?:非贪婪模式的任意字符匹配(因勾选了. matches newline,所以包含换行符),会尽可能少地匹配内容,直到触发后续断言条件就停止。
  2. (?=CREATE OR REPLACE):正向零宽断言,用于定位到CREATE OR REPLACE的起始位置,不会将该字符串包含在匹配结果中。

操作步骤

  1. 打开Notepad++并加载目标SQL文件;
  2. 按下Ctrl+F打开查找对话框,切换到Regular expression模式;
  3. 勾选**. matches newline**选项;
  4. 在查找框中输入上述正则表达式,点击查找即可匹配到目标内容。

内容的提问来源于stack exchange,提问作者user1169587

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 12:15:55