为什么 regexp_replace 没有用某些东西代替任何东西?
Why does regexp_replace replaces nothing with something?
我必须更新几个脚本才能使用另一个模式中的 table:
S1.MYTABLE => S2.MYTABLE2.
另外,当我替换 table 的名称时,我想保留原始脚本的格式。如果在 S1.MYTABLE
之后有一个,则在 S2.MYTABLE2 之后保持输入或 space
我的代码似乎工作正常,但在字符串的末尾连接 S2.MYTABLE2.
这是我的测试脚本:(这只是我的问题的简化示例)
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;
函数的代码MY_FUNCTION,虽然不切实际,但举例说明了我正在处理的所有情况。
运行 这个脚本的结果:
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,保持原来的格式(spaces 并输入)。
但由于某些原因 S2.MYTABLE2 被连接在最后。
为什么 regexp_replace 在脚本末尾连接 S2.MYTABLE2?
有没有更好的方法来实现我想要的? 将 table 替换为另一个,保持格式。
这是问题所在:
\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;
这是末尾没有 table 名称的输出 -
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;
编辑:如果您的正则表达式模式也可能出现在整个字符串的末尾(而不仅仅是一行的末尾),您可能需要按照@DavidFaber 的回答进行操作。
我必须更新几个脚本才能使用另一个模式中的 table: S1.MYTABLE => S2.MYTABLE2.
另外,当我替换 table 的名称时,我想保留原始脚本的格式。如果在 S1.MYTABLE
之后有一个,则在 S2.MYTABLE2 之后保持输入或 space我的代码似乎工作正常,但在字符串的末尾连接 S2.MYTABLE2.
这是我的测试脚本:(这只是我的问题的简化示例)
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;
函数的代码MY_FUNCTION,虽然不切实际,但举例说明了我正在处理的所有情况。
运行 这个脚本的结果:
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,保持原来的格式(spaces 并输入)。
但由于某些原因 S2.MYTABLE2 被连接在最后。
为什么 regexp_replace 在脚本末尾连接 S2.MYTABLE2?
有没有更好的方法来实现我想要的? 将 table 替换为另一个,保持格式。
这是问题所在:
\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;
这是末尾没有 table 名称的输出 -
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;
编辑:如果您的正则表达式模式也可能出现在整个字符串的末尾(而不仅仅是一行的末尾),您可能需要按照@DavidFaber 的回答进行操作。