Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么regexp_用某物替换nothing?_Regex_Oracle_Oracle10g - Fatal编程技术网

为什么regexp_用某物替换nothing?

为什么regexp_用某物替换nothing?,regex,oracle,oracle10g,Regex,Oracle,Oracle10g,我必须更新几个脚本才能使用另一个架构中的表: S1.MYTABLE=>S2.MYTABLE 2 另外,当我替换表名时,我希望保留原始脚本的格式。如果在S2.MYTABLE 2之后有空格,则在S1.MYTABLE之后保留enter或空格 我的代码似乎工作得很好,但在字符串末尾concatsS2.MYTABLE2 这是我的测试脚本:(这只是我问题的简化示例) 函数MY_函数的代码虽然不现实,但它举例说明了我正在处理的所有情况 运行此脚本的结果: CREATE OR REPLACE FUNCTION

我必须更新几个脚本才能使用另一个架构中的表: S1.MYTABLE=>S2.MYTABLE 2

另外,当我替换表名时,我希望保留原始脚本的格式。如果在S2.MYTABLE 2之后有空格,则在S1.MYTABLE之后保留enter或空格

我的代码似乎工作得很好,但在字符串末尾concatsS2.MYTABLE2

这是我的测试脚本:(这只是我问题的简化示例)

函数MY_函数的代码虽然不现实,但它举例说明了我正在处理的所有情况

运行此脚本的结果:

CREATE OR REPLACE FUNCTION "S1"."MY_FUNCTION" (PARAMETER1 VARCHAR2)
   RETURN VARCHAR2
AS
   something1    VARCHAR2 (50);
   OUTsomething   VARCHAR2 (50);
BEGIN
   BEGIN
      SELECT COLUMN1
        INTO OUTsomething
        FROM S1.MYTABLE_RELATED
       WHERE COLUMN2 = 'xx' AND COLUMN2 = PARAMETER1;

       SELECT COLUMN1
        INTO OUTsomething
        FROM S2.MYTABLE2
       WHERE COLUMN2 = 'xx' AND COLUMN2 = PARAMETER1;

       SELECT COLUMN1
        INTO OUTsomething
        FROM S2.MYTABLE2 WHERE COLUMN2 = 'xx' AND COLUMN2 = PARAMETER1;                                           
   RETURN OUTsomething;

   SELECT COLUMN1
        INTO OUTsomething
        FROM S2.MYTABLE2                                  
        WHERE COLUMN2 = 'xx' AND COLUMN2 = PARAMETER1;                                           
   RETURN OUTsomething;
END;S2.MYTABLE2
如您所见,S1。MYTABLE已在所有相关位置替换为S2。MYTABLE2保留了原始格式(空格和回车)

但是由于某种原因,S2.MYTABLE2在末尾被连接起来

为什么要用regexp\u替换脚本末尾的concatating S2.MYTABLE2?

有没有更好的方法来实现我的目标?用另一个表替换一个表,保持格式。

这就是问题所在:

\s|($)
它表示交替匹配,最终将用新文本替换字符串结束锚定。我想你想要这个:

(\s|$)

这可能是因为第二个正则表达式中的
|($)
。不知道你为什么要在那里

在删除该条后—

DECLARE
   testtext      VARCHAR2 (2000)
      := 'CREATE OR REPLACE FUNCTION "S1"."MY_FUNCTION" (PARAMETER1 VARCHAR2)
   RETURN VARCHAR2
AS
   something1    VARCHAR2 (50);
   OUTsomething   VARCHAR2 (50);
BEGIN
   BEGIN
      SELECT COLUMN1
        INTO OUTsomething
        FROM S1.MYTABLE_RELATED
       WHERE COLUMN2 = ''xx'' AND COLUMN2 = PARAMETER1;

       SELECT COLUMN1
        INTO OUTsomething
        FROM S1.MYTABLE
       WHERE COLUMN2 = ''xx'' AND COLUMN2 = PARAMETER1;

       SELECT COLUMN1
        INTO OUTsomething
        FROM S1.MYTABLE WHERE COLUMN2 = ''xx'' AND COLUMN2 = PARAMETER1;                                           
   RETURN OUTsomething;

   SELECT COLUMN1
        INTO OUTsomething
        FROM S1.MYTABLE                                  
        WHERE COLUMN2 = ''xx'' AND COLUMN2 = PARAMETER1;                                           
   RETURN OUTsomething;
END;';

   script        CLOB;
   owner         VARCHAR2 (30) := 'S1';
   object_name   VARCHAR2 (30) := 'MYTABLE';
   output_name   VARCHAR2 (30) := 'MYTABLE2';
   destination   VARCHAR2 (30) := 'S2';
BEGIN
   script      :=
      REGEXP_REPLACE (
         testtext,
         OWNER || '[[:space:]]*\.[[:space:]]*' || OBJECT_NAME || ' ',
         DESTINATION || '.' || OUTPUT_NAME || ' ',
         1,
         0,
         'i');
   script      :=
      REGEXP_REPLACE (
         script,
         OWNER || '[[:space:]]*\.[[:space:]]*' || OBJECT_NAME || '\s',
         DESTINATION || '.' || OUTPUT_NAME || CHR (13) || CHR (10),
         1,
         0,
         'i');
   DBMS_OUTPUT.PUT_LINE (script);
END;
以下是末尾没有表名的输出-

CREATE OR REPLACE FUNCTION "S1"."MY_FUNCTION" (PARAMETER1 VARCHAR2)
   RETURN VARCHAR2
AS
   something1    VARCHAR2 (50);
   OUTsomething   VARCHAR2 (50);
BEGIN
   BEGIN
      SELECT COLUMN1
        INTO OUTsomething
        FROM S1.MYTABLE_RELATED
       WHERE COLUMN2 = 'xx' AND COLUMN2 = PARAMETER1;

       SELECT COLUMN1
        INTO OUTsomething
        FROM S2.MYTABLE2
       WHERE COLUMN2 = 'xx' AND COLUMN2 = PARAMETER1;

       SELECT COLUMN1
        INTO OUTsomething
        FROM S2.MYTABLE2 WHERE COLUMN2 = 'xx' AND COLUMN2 = PARAMETER1;                                           
   RETURN OUTsomething;

   SELECT COLUMN1
        INTO OUTsomething
        FROM S2.MYTABLE2                                  
        WHERE COLUMN2 = 'xx' AND COLUMN2 = PARAMETER1;                                           
   RETURN OUTsomething;
END;
编辑:如果您的正则表达式模式也可能出现在整个字符串的末尾(而不仅仅是一行的末尾),您可能需要按照@davidaber的答案执行操作

CREATE OR REPLACE FUNCTION "S1"."MY_FUNCTION" (PARAMETER1 VARCHAR2)
   RETURN VARCHAR2
AS
   something1    VARCHAR2 (50);
   OUTsomething   VARCHAR2 (50);
BEGIN
   BEGIN
      SELECT COLUMN1
        INTO OUTsomething
        FROM S1.MYTABLE_RELATED
       WHERE COLUMN2 = 'xx' AND COLUMN2 = PARAMETER1;

       SELECT COLUMN1
        INTO OUTsomething
        FROM S2.MYTABLE2
       WHERE COLUMN2 = 'xx' AND COLUMN2 = PARAMETER1;

       SELECT COLUMN1
        INTO OUTsomething
        FROM S2.MYTABLE2 WHERE COLUMN2 = 'xx' AND COLUMN2 = PARAMETER1;                                           
   RETURN OUTsomething;

   SELECT COLUMN1
        INTO OUTsomething
        FROM S2.MYTABLE2                                  
        WHERE COLUMN2 = 'xx' AND COLUMN2 = PARAMETER1;                                           
   RETURN OUTsomething;
END;