Javascript 正则表达式排除模式

Javascript 正则表达式排除模式,javascript,regex,Javascript,Regex,我想从PLSQL脚本中提取“创建语句”。 我知道这可以用Lexer/Parser来完成,但我正在尝试用JavaScript正则表达式来完成 给定一个包含此内容的“脚本”,我想提取不同的语句 CREATE OR REPLACE TYPE BODY Cheopsregbp.SITE_OT AS CONSTRUCTOR FUNCTION SITE_OT ( p_site_list_id VARCHAR2 , p_traductions TRADUCTIONS_

我想从PLSQL脚本中提取“创建语句”。 我知道这可以用Lexer/Parser来完成,但我正在尝试用JavaScript正则表达式来完成

给定一个包含此内容的“脚本”,我想提取不同的语句

  CREATE OR REPLACE TYPE BODY Cheopsregbp.SITE_OT AS

  CONSTRUCTOR FUNCTION SITE_OT (
         p_site_list_id VARCHAR2
       , p_traductions TRADUCTIONS_MAP_ENTRY_CT := new TRADUCTIONS_MAP_ENTRY_CT()
      )
    RETURN SELF AS RESULT
  AS
  BEGIN
    SELF.site_list_id := p_site_list_id;
    SELF.traductions := p_traductions;
    RETURN;
  END;

  STATIC FUNCTION convert_to_date(p_date_string in VARCHAR2, p_field_name_in in VARCHAR2, p_field_name_out IN OUT NOCOPY VARCHAR2) RETURN DATE IS
  BEGIN
    -- function to convert string to date and keep track of which field we are converting => needed to produce error
    p_field_name_out := p_field_name_in; -- this will cause fieldName (declared in verify) to be updated before potential fail in next line
    RETURN cast(to_timestamp(p_date_string, Cheopsregbp.API_CONST_HLPR.DATE_FORMAT) as date);
  END convert_to_date;

  STATIC FUNCTION convert_to_number(p_number_string in VARCHAR2, p_field_name_in in VARCHAR2, p_field_name_out IN OUT NOCOPY VARCHAR2) RETURN NUMBER IS
  BEGIN
    -- function to convert string to number and keep track of which field we are converting => needed to produce error
    p_field_name_out := p_field_name_in; -- this will cause fieldName (declared in verify) to be updated before potential fail in next line
    RETURN cast(p_number_string as number);
  END convert_to_number;

  STATIC FUNCTION from_json(p_json_object in BLOB) RETURN SITE_OT IS -- $$ref-ot-fromJson-BLOB
    l_clob CLOB;
    l_warning INTEGER;
    l_offset INTEGER := 1;
    l_csId INTEGER := nls_charset_id('UTF8');
    l_lang_context INTEGER := DBMS_LOB.default_lang_ctx;
    l_amount INTEGER := DBMS_LOB.lobMaxSize;
  BEGIN
    IF p_json_object IS NULL THEN
      RETURN null;
    END IF;
    dbms_lob.createTemporary(lob_loc => l_clob, cache => false);
    dbms_lob.convertToClob(  dest_lob     => l_clob
                            ,src_blob     => p_json_object
                            ,amount       => l_amount
                            ,dest_offset  => l_offset
                            ,src_offset   => l_offset
                            ,blob_csId    => l_csId
                            ,lang_context => l_lang_context
                            ,warning      => l_warning);
    apex_json.parse(l_clob);
    RETURN from_json(''); -- '' => root-path -- works with apex_json.g_values!
  END from_json;

  STATIC FUNCTION from_json(p_parent in VARCHAR2) -- works with apex_json.g_values!
  RETURN SITE_OT IS -- $$ref-ot-fromJson-CLOB
    l_arr_count INTEGER;
    l_parent VARCHAR2(2048 CHAR) := p_parent;
    l_api_error API_ERROR_OT;
    l_field_name Cheopsregbp.API_CONST_HLPR.CHAR256;
    l_traductions TRADUCTIONS_MAP_ENTRY_CT := new TRADUCTIONS_MAP_ENTRY_CT();
    l_result SITE_OT;
  BEGIN
    IF p_parent IS NOT NULL THEN l_parent := p_parent || '.'; END IF;
        -- prepare list of traductions
        l_arr_count := apex_json.get_count(p_path => l_parent || 'traductions'); -- works with apex_json.g_values!
        IF l_arr_count > 0 THEN
            FOR i in 1 .. l_arr_count LOOP
                l_traductions.extend;
                l_traductions(l_traductions.last) := TRADUCTIONS_MAP_ENTRY_OT.from_json( l_parent || 'traductions['||i||']'); -- $$ref-fromJSONListItemFn
            END LOOP;
        END IF;
        l_result := SITE_OT( -- $$ref-fromJSONReturn
      p_site_list_id => apex_json.GET_VARCHAR2( l_parent || 'site_list_id'), -- $$ref-returnJSONField
      p_traductions => l_traductions
    );
    RETURN l_result;
  EXCEPTION -- $$ref-fromJSONExceptions
    WHEN NO_DATA_FOUND THEN
        l_api_error := new API_ERROR_OT(Cheopsregbp.API_CONST_HLPR.NO_DATA_FOUND, Cheopsregbp.API_CONST_HLPR.HTTP_404, l_field_name);
        l_api_error.sqlcode := sqlcode;
        l_api_error.sqlerrm := sqlerrm;
        l_api_error.stacktrace := 'SITE_OT.verify';
        API_CORE_HLPR.add_error(l_api_error);
        RETURN NULL;
    WHEN OTHERS THEN
        l_api_error := new API_ERROR_OT(Cheopsregbp.API_CONST_HLPR.INVALID_DATA, Cheopsregbp.API_CONST_HLPR.HTTP_400, l_field_name);
        l_api_error.sqlcode := sqlcode;
        l_api_error.sqlerrm := sqlerrm;
        l_api_error.stacktrace := 'SITE_OT.verify';
        API_CORE_HLPR.add_error(l_api_error);
        RETURN NULL;
  END from_json;

  MEMBER PROCEDURE verify(p_parent IN VARCHAR2 := null) AS -- $$ref-ot-verify
    l_params Cheopsregbp.API_CONST_HLPR.CHAR1024;
    l_parent Cheopsregbp.API_CONST_HLPR.CHAR256;
    l_api_error API_ERROR_OT;
  BEGIN
    IF p_parent  IS NOT NULL THEN
        l_parent := p_parent || '.';
    END IF;
    -- key field does not have to be present. POST => new => no PK yet; PUT => PK is in URL!
    -- If PK value is specified in body then it should be checked against URL param value though (in business logic)!
    /** traductions is REQUIRED!! */
    IF SELF.traductions IS NULL THEN
       l_api_error := new API_ERROR_OT('REQUIRED', 400, l_parent||'traductions');
       l_api_error.sqlerrm := 'REQUIRED' || ':'|| l_parent||'traductions';
       l_api_error.stacktrace  := 'SITE_OT.verify';
       API_CORE_HLPR.add_error(l_api_error);
    END IF;
    -- validate children (if any)
    /** verify all traductions */
    IF SELF.traductions IS NOT NULL AND SELF.traductions.COUNT > 0 THEN
        <<verify_fields_loop>>
       FOR i IN 1 .. SELF.traductions.COUNT LOOP
          SELF.traductions(i).verify('traductions['||(i-1)||']'); -- $$verifyChild (UI zero-based)
       END LOOP verify_fields_loop;
    END IF;
  END verify;

  MEMBER PROCEDURE add_traductions(p_traductions_map_entry IN TRADUCTIONS_MAP_ENTRY_OT) IS -- $$OOT.ADD2
  BEGIN
      SELF.traductions.extend;
      SELF.traductions(SELF.traductions.last) := p_traductions_map_entry;
  END add_traductions;

END;
/

GRANT EXECUTE ON SITE_OT TO Cheopsregbp;
/
创建或替换类型正文cheopsrebp.SITE\u OT AS
构造函数函数站点(
p_站点\u列表\u id VARCHAR2
,p_traducations traducations_MAP_ENTRY_CT:=新交易_MAP_ENTRY_CT()
)
归来
作为
开始
SELF.site\u list\u id:=p\u site\u list\u id;
自我交易:=p_交易;
返回;
结束;
静态函数convert_to_date(VARCHAR2中的p_date_字符串,VARCHAR2中的p_field_name_in,p_field_name_out in out NOCOPY VARCHAR2)返回日期为
开始
--函数将字符串转换为日期,并跟踪要转换的字段=>产生错误所需的字段
p_字段\u名称\u输出:=p_字段\u名称\u输入;——这将导致fieldName(在verify中声明)在下一行出现潜在故障之前更新
返回强制转换(到时间戳(p_date_字符串,cheopsrebp.API_CONST_HLPR.date_格式)作为日期);
结束转换为日期;
静态函数convert_to_number(VARCHAR2中的p_number_字符串,VARCHAR2中的p_字段_name_in,VARCHAR2中的p_字段_name_out in out NOCOPY VARCHAR2)返回编号为
开始
--函数将字符串转换为数字,并跟踪要转换的字段=>产生错误所需的字段
p_字段\u名称\u输出:=p_字段\u名称\u输入;——这将导致fieldName(在verify中声明)在下一行出现潜在故障之前更新
返回强制转换(p_编号\u字符串作为编号);
结束将_转换为_编号;
_json(BLOB中的p_json_对象)的静态函数返回SITE_OT是--$$ref OT fromJson BLOB
l_clob clob;
l_警告整数;
l_偏移整数:=1;
l_csId INTEGER:=nls_字符集_id('UTF8');
l_lang_context INTEGER:=DBMS_LOB.default_lang_ctx;
l_amount INTEGER:=DBMS_LOB.lobMaxSize;
开始
如果p_json_对象为空,则
返回null;
如果结束;
dbms_lob.createTemporary(lob_loc=>l_clob,cache=>false);
dbms_lob.convertToClob(dest_lob=>l_clob
,src_blob=>p_json_对象
,金额=>l_金额
,dest_offset=>l_offset
,src_offset=>l_offset
,blob_csId=>l_csId
,lang_context=>l_lang_context
,警告=>l_警告);
parse(l_clob);
从_json('');--''=>根路径——使用apex_json.g_值!
从_json结束;
来自_json(VARCHAR2中的p_父级)的静态函数——用于apex_json.g_值!
返回站点\u OT是--$$ref OT fromJson CLOB
l_arr_count整数;
l_parent VARCHAR2(2048字符):=p_parent;
l_api_错误api_错误OT;
l_field_name cheopsregpp.API_CONST_HLPR.CHAR256;
l_交易交易交易地图交易记录:=新交易地图交易记录();
l_结果站点_OT;
开始
如果p_parent不为NULL,则l_parent:=p_parent | |';如果结束;
--准备交易清单
l_arr_count:=apex_json.get_count(p_path=>l_parent | | |‘traductions’);--适用于apex_json.g_值!
如果l_arr_count>0,则
因为我在1。。l_arr_计数循环
l_traducations.extend;
l_traductions(l_traductions.last):=traductions_MAP_ENTRY_OT.from_json(l_parent | |'traductions['| | i | |']);--$$引用自JSONListItemfn
端环;
如果结束;
l_结果:=站点_OT(-$$ref fromJSONReturn
p_site_list_id=>apex_json.GET_VARCHAR2(l_parent | | |'site_list_id'),--$$ref returnJSONField
p_交易=>l_交易
);
返回l_结果;
异常--$$ref fromJSONExceptions
当找不到数据时
l_api_error:=新的api_error_OT(cheopsrebp.api_CONST_HLPR.NO_DATA_find,cheopsrebp.api_CONST_HLPR.HTTP_404,l_字段名称);
l_api_error.sqlcode:=sqlcode;
l_api_error.sqlerrm:=sqlerrm;
l_api_error.stacktrace:=“站点_OT.verify”;
API\U CORE\U HLPR.添加错误(l\U API\U错误);
返回NULL;
当其他人
l_api_error:=新的api_error_OT(cheopsrebp.api_CONST_HLPR.INVALID_数据,cheopsrebp.api_CONST_HLPR.HTTP_400,l_字段名称);
l_api_error.sqlcode:=sqlcode;
l_api_error.sqlerrm:=sqlerrm;
l_api_error.stacktrace:=“站点_OT.verify”;
API\U CORE\U HLPR.添加错误(l\U API\U错误);
返回NULL;
从_json结束;
成员过程验证(VARCHAR2中的p_parent:=null)为--$$ref ot verify
l_params cheopsrebp.API_CONST_HLPR.CHAR1024;
l_parent cheopsrebp.API_CONST_HLPR.CHAR256;
l_api_错误api_错误OT;
开始
如果p_parent不为NULL,则
l_parent:=p_parent | |';
如果结束;
--键字段不必存在。POST=>new=>还没有主键;PUT=>PK在URL中!
--若PK值是在body中指定的,那个么应该根据URL参数值进行检查(在业务逻辑中)!
/**交易是必需的*/
如果SELF.tradings为空,则
l_api_error:=新api_error_OT('REQUIRED',400,l_parent | | |'traducations');
l|u api|u error.sqlerrm:=“必需”| |“:”| | l| u父项| | |“交易”;
l_api_error.stacktrace:=“站点_OT.verify”;
API\U CORE\U HLPR.添加错误(l\U API\U错误);
如果结束;
--验证子项(如果有)
/**核实所有交易*/
如果SELF.traductions不为NULL且SELF.traductions.COUNT>0,则
因为我在1。。自我交易计数循环
自我交易(i).verify(‘交易’| | |(i-1)| | |’)—$$verifyChild(基于用户界面零)
结束循环验证\u字段\u循环;
如果结束;
结束验证;
成员程序添加交易(交易中的交易映射条目)为--$$OOT.ADD2
开始
自我贸易延伸;
SELF.traductions(SELF.traductions.last):=p\u traductions\u map_