首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >甲骨文中的Regep_replace是否有组限制?(与regexp_replace发行)

甲骨文中的Regep_replace是否有组限制?(与regexp_replace发行)
EN

Stack Overflow用户
提问于 2015-05-19 18:10:09
回答 1查看 786关注 0票数 0

目前,我得到了一个长输入字符串,我想用regexp_replace进行反转。通常,我使用以下方法替换字符串位置(在PL/SQL中的begin子句中)

代码语言:javascript
复制
variable:= regexp_replace(variable, '(.+) (.+) (.+) (.+)', '\4 \3 \2 \1');

在这种情况下,我的变量将被替换成一个相反的顺序,它可以工作。我的问题和我的问题是。组建团体有限制吗?因为我有一条绳子:

代码语言:javascript
复制
US 816909877808647715885542447721 UOPX

我把这个字符串作为输入输入到我的函数中,然后函数开始转换这个字符串。在某一点上,它使四人小组(这也是工作)。为此,我使用以下方法:

代码语言:javascript
复制
variable:= regexp_replace(variable, '(....)', '\1 ');

这将导致下一个输出:

代码语言:javascript
复制
3630 3139 3634 8169 0987 7808 6477 1588 5542 4477 21 -- also did ASCII to number

所以现在我得到了我想要的。整根绳子分成四组。但是现在我的问题是,当我想用下面的代码反转这11个组时:

代码语言:javascript
复制
  convertedStudentNumber := regexp_replace(convertedStudentNumber, '(.+) (.+) (.+) (.+) (.+) (.+) (.+) (.+) (.+) (.+) (.+)', '\11 \10 \9 \8 \7 \6 \5 \4 \3 \2 \1');

这是我的结果:

代码语言:javascript
复制
36301 36300 5542 1588 6477 7808 0987 8169 3634 3139 3630

当我用9个组逆转小组时,如下:

代码语言:javascript
复制
  variable:= regexp_replace(variable, '(.+) (.+) (.+) (.+) (.+) (.+) (.+) (.+) (.+)', '\9 \8 \7 \6 \5 \4 \3 \2 \1');

这是我的结果:

代码语言:javascript
复制
21 4477 5542 1588 6477 7808 0987 8169 3630 3139 3634

有了这9个小组,我更接近我想要达到的目标。但最后三组仍然无法以某种奇怪的方式固定下来。

代码语言:javascript
复制
21 4477 5542 1588 6477 7808 0987 8169 [3630 3139 3634]--won't work.

总之。这是我想按组反转的字符串。

代码语言:javascript
复制
3630 3139 3634 8169 0987 7808 6477 1588 5542 4477 21

但我不会比

代码语言:javascript
复制
21 4477 5542 1588 6477 7808 0987 8169 [3630 3139 3634]
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-19 19:41:11

Oracle只允许9个反向引用,因此您将无法使用\10或更高版本。但是,为什么不使用您的字符串并反转每个组呢?

例如:

代码语言:javascript
复制
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;

结果:

代码语言:javascript
复制
3630 3139 3634 8169 0987 7808 6477 1588 5542 4477 21

现在,反转每个数字组的顺序(从这里获取的技术:Reverse String Word by Word using SQL):

代码语言:javascript
复制
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;

结果:

代码语言:javascript
复制
21 4477 5542 1588 6477 7808 0987 8169 3634 3139 3630

下面是PL/SQL脚本中的相同内容:

代码语言:javascript
复制
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

尝试运行以下查询:

代码语言:javascript
复制
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;

结果:

代码语言:javascript
复制
NUMBER_GROUP  LEVEL
3630          1
3139          2
3634          3
8169          4
0987          5
7808          6
6477          7
1588          8
5542          9
4477          10
21            11

LENGTH(str)是字符串的长度(放入空格后),为52。LENGTH(REPLACE(str, ' '))是删除空格的长度,即42。如果采用(52-42)+1,则得到11,这是所有数字分组所需的行数。然后,我们按DESC顺序接受该列表,并使用LISTAGG (以空格作为分隔符)重新组装字符串。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30333049

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档