代码之家  ›  专栏  ›  技术社区  ›  user1169587

正则表达式发现文档的一部分从某个字符串开始,然后不跟在某个字符串后面

  •  1
  • user1169587  · 技术社区  · 7 月前

    对于以下示例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 OR PRELACE”。

    也就是说,它匹配

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

    want to match as follow, in picture

    怎么做?

    在记事本++中,我尝试勾选复选框“.matches换行符”,选择“正则表达式”,然后找到

    CREATE TABLE.+(?![CREATE OR REPLACE])
    

    但它与所有单词都匹配。

    1 回复  |  直到 7 月前
        1
  •  1
  •   Bending Rodriguez    7 月前

    此正则表达式将匹配任何以CREATE开头的内容,使用负前瞻不匹配OR REPLACE,拾取任何内容,直到下一个分号。

    CREATE(?! OR REPLACE)[\S\s]*?;
    

    更新:另一种更有效的方法是:

    CREATE(?! OR REPLACE)[^;]*;
    

    在Notepad++中使用 search mark 还有正则表达式,你自己看看。

    Got to Find...

    Use Mark...

    结果:

    End Result