这个正则表达式有什么问题,不能正常工作?

时间:2013-09-30 01:48:33

标签: c# regex oracle string-literals

我的查询在我的oracle中运行正常,但是当我在oracle命令中添加它时,在[A-Z]和\ 1 \ 3处收到错误,说出无法识别的字符。我想我需要使用@ some where to make it correct但我不知道在哪里?

* 我的查询以查看没有用户名的触发器的定义:还删除以ALTER TRIGGER开头的行.. *

OracleCommand Command = new OracleCommand(@"SELECT regexp_replace(dbms_metadata.get_ddl('TRIGGER','" + triggernames + "'),'(CREATE OR REPLACE TRIGGER )("[A-Z]+"\.)(.+)(ALTER TRIGGER .+)','\1\3', 1, 0, 'n')FROM dual", connection))

结果:

CREATE OR REPLACE TRIGGER "USER"."EMP"
    BEFORE INSERT OR UPDATE
    of salary
    on employee
    for each row
   declare
       v_error VARCHAR2(20);
    begin
       if :new.salary > 10
      then
           v_error:=:old.first_name||' cannot have that much!';
           raise_application_error(-20999,v_error);
       end if;
end;
ALTER TRIGGER "USER"."EMP" ENABLE

预期结果:

CREATE OR REPLACE TRIGGER "EMP"
    BEFORE INSERT OR UPDATE
    of salary
    on employee
    for each row
   declare
       v_error VARCHAR2(20);
    begin
       if :new.salary > 10
      then
           v_error:=:old.first_name||' cannot have that much!';
           raise_application_error(-20999,v_error);
       end if;
end;

1 个答案:

答案 0 :(得分:1)

@不会为你逃避所有的逃避。您需要使用'\'转义[A-Z]周围的引号。

同样处理\ 1 \ 3,'\'表示它是一个转义序列,你真正的意思是字面'\'。

E.g:

OracleCommand Command = new OracleCommand(@"SELECT regexp_replace(dbms_metadata.get_ddl('TRIGGER','" + triggernames + "'),'(CREATE OR REPLACE TRIGGER )(\"[A-Z]+\"\.)(.+)(ALTER TRIGGER .+)','\\1\\3', 1, 0, 'n')FROM dual", conn1))

或者,如果你想使用第二个'@',你需要使用quote-escape-sequence(一个双“”)

e.g:

@"SELECT regexp_replace(dbms_metadata.get_ddl('TRIGGER','" + triggernames + @"'),'(CREATE OR REPLACE TRIGGER )(""[A-Z]+""\.)(.+)(ALTER TRIGGER .+)','\1\3', 1, 0, 'n')FROM dual"