目前,我得到了一个长输入字符串,我想用regexp_replace进行反转。通常,我使用以下方法替换字符串位置(在PL/SQL中的begin子句中)
variable:= regexp_replace(variable, '(.+) (.+) (.+) (.+)', '\4 \3 \2 \1');在这种情况下,我的变量将被替换成一个相反的顺序,它可以工作。我的问题和我的问题是。组建团体有限制吗?因为我有一条绳子:
US 816909877808647715885542447721 UOPX我把这个字符串作为输入输入到我的函数中,然后函数开始转换这个字符串。在某一点上,它使四人小组(这也是工作)。为此,我使用以下方法:
variable:= regexp_replace(variable, '(....)', '\1 ');这将导致下一个输出:
3630 3139 3634 8169 0987 7808 6477 1588 5542 4477 21 -- also did ASCII to number所以现在我得到了我想要的。整根绳子分成四组。但是现在我的问题是,当我想用下面的代码反转这11个组时:
convertedStudentNumber := regexp_replace(convertedStudentNumber, '(.+) (.+) (.+) (.+) (.+) (.+) (.+) (.+) (.+) (.+) (.+)', '\11 \10 \9 \8 \7 \6 \5 \4 \3 \2 \1');这是我的结果:
36301 36300 5542 1588 6477 7808 0987 8169 3634 3139 3630当我用9个组逆转小组时,如下:
variable:= regexp_replace(variable, '(.+) (.+) (.+) (.+) (.+) (.+) (.+) (.+) (.+)', '\9 \8 \7 \6 \5 \4 \3 \2 \1');这是我的结果:
21 4477 5542 1588 6477 7808 0987 8169 3630 3139 3634有了这9个小组,我更接近我想要达到的目标。但最后三组仍然无法以某种奇怪的方式固定下来。
21 4477 5542 1588 6477 7808 0987 8169 [3630 3139 3634]--won't work.总之。这是我想按组反转的字符串。
3630 3139 3634 8169 0987 7808 6477 1588 5542 4477 21但我不会比
21 4477 5542 1588 6477 7808 0987 8169 [3630 3139 3634]发布于 2015-05-19 19:41:11
Oracle只允许9个反向引用,因此您将无法使用\10或更高版本。但是,为什么不使用您的字符串并反转每个组呢?
例如:
create table test (
v varchar(100)
);
insert into test values ('363031393634816909877808647715885542447721');
select v, regexp_replace(v, '([0-9]{4})', '\1 ') as v_replaced
from test;结果:
3630 3139 3634 8169 0987 7808 6477 1588 5542 4477 21现在,反转每个数字组的顺序(从这里获取的技术:Reverse String Word by Word using SQL):
WITH str_tab(str1, rn) AS
(SELECT regexp_substr(str, '[^\[:space:]]+', 1, LEVEL),
LEVEL
FROM (SELECT regexp_replace(v, '([0-9]{4})', '\1 ') str
FROM test) tab
CONNECT BY LEVEL <= LENGTH(str) - LENGTH(REPLACE(str, ' ')) + 1)
SELECT listagg(str1, ' ') WITHIN GROUP (ORDER BY rn DESC) AS new_text
FROM str_tab;结果:
21 4477 5542 1588 6477 7808 0987 8169 3634 3139 3630下面是PL/SQL脚本中的相同内容:
declare
variable varchar(100) := '363031393634816909877808647715885542447721';
begin
-- You don't need these next two lines.
-- They just show you the variable modified to have a space
-- after every four digits. You can remove these lines.
variable := regexp_replace(variable, '([0-9]{4})', '\1 ');
dbms_output.put_line('variable: ' || variable);
-- Get the reversed string INTO the variable
WITH str_tab(str1, rn) AS
(SELECT regexp_substr(str, '[^\[:space:]]+', 1, LEVEL), LEVEL
FROM (SELECT regexp_replace(variable, '([0-9]{4})', '\1 ') str FROM test) tab
CONNECT BY LEVEL <= LENGTH(str) - LENGTH(REPLACE(str, ' ')) + 1)
SELECT listagg(str1, ' ') WITHIN GROUP (ORDER BY rn DESC) AS new_text
INTO variable
FROM str_tab;
dbms_output.put_line('variable: ' || variable);
end;CONNECT定义层次结构中父行和子行之间的关系。要理解它,请查看层次查询文档中的分层查询示例:01/server.102/b14200/queries003.htm
尝试运行以下查询:
SELECT regexp_substr(str, '[^\[:space:]]+', 1, LEVEL) number_group, LEVEL
FROM (SELECT regexp_replace('363031393634816909877808647715885542447721', '([0-9]{4})', '\1 ') str FROM test)
CONNECT BY LEVEL <= LENGTH(str) - LENGTH(REPLACE(str, ' ')) + 1;结果:
NUMBER_GROUP LEVEL
3630 1
3139 2
3634 3
8169 4
0987 5
7808 6
6477 7
1588 8
5542 9
4477 10
21 11LENGTH(str)是字符串的长度(放入空格后),为52。LENGTH(REPLACE(str, ' '))是删除空格的长度,即42。如果采用(52-42)+1,则得到11,这是所有数字分组所需的行数。然后,我们按DESC顺序接受该列表,并使用LISTAGG (以空格作为分隔符)重新组装字符串。
https://stackoverflow.com/questions/30333049
复制相似问题