如何在CLOB字段中将regex_replace排在第10位

时间:2019-04-30 03:12:58

标签: sql regex oracle

我有此代码:

SELECT REGEXP_REPLACE(name,'^name\[([[:alpha:][:space:][:digit:]]*)\|\|\|([[:alpha:]]*)\|\|\|([[[:alpha:][:space:][:punct:]]*)\|\|\|([[:digit:][:alpha:]]*)\|\|\|([[:digit:][:punct:]]*)\|\|\|([[:alpha:][:space:]]*)\|\|\|([[:alpha:]]*)\|\|\|([[:digit:]]*)\|\|\|([[:alpha:][:space:]]*)\|\|\|([[:alpha:]]*)\|\|\|([[:digit:][:alpha:]]*)\|\|\|([[:digit:][:alpha:][:space:]]*)\|\|\|([[:digit:][:alpha:]]*)\|\|\|([[:alpha:][:space:]]*)\|\|\|([[:alpha:]]*).*','[p1=\10]') as replaced

FROM  Dual 

编者注:以上是单个不可读的行。这是具有换行符的正则表达式,以提高可读性:

SELECT REGEXP_REPLACE(name
                      ,'^name\[([[:alpha:][:space:][:digit:]]*)\|\|\|
                       ([[:alpha:]]*)\|\|\|
                       ([[[:alpha:][:space:][:punct:]]*)\|\|\|
                       ([[:digit:][:alpha:]]*)\|\|\|
                       ([[:digit:][:punct:]]*)\|\|\|
                       ([[:alpha:][:space:]]*)\|\|\|
                       ([[:alpha:]]*)\|\|\|
                       ([[:digit:]]*)\|\|\|
                       ([[:alpha:][:space:]]*)\|\|\|
                       ([[:alpha:]]*)\|\|\|
                       ([[:digit:][:alpha:]]*)\|\|\|
                       ([[:digit:][:alpha:][:space:]]*)\|\|\|
                       ([[:digit:][:alpha:]]*)\|\|\|
                       ([[:alpha:][:space:]]*)\|\|\|
                       ([[:alpha:]]*).*'
        ,'[p1=\10]') as replaced

FROM  Dual 

我要从中选择第十个位置。我可以选择直到九个职位,但我无法在上述逻辑上排名第十。任何猜测或帮助。

[p1=\9]如果使用此表达式,我可以选择9个位置,但我希望从上述表达式中选择第10个位置字符串。

[p1=\10]如果我的表情是这样,那就是选择第一个位置的值,然后选择0

有帮助吗?

1 个答案:

答案 0 :(得分:0)

这是一个与您的正则表达式匹配的字符串的非常基本的示例:

name[a|||b|||c|||d|||0|||e|||f|||1|||g|||h|||i|||j|||k|||l|||m

因此,您想返回第十个字段“ h”,但是\ 10返回a0。

如果您只对第十个捕获组感兴趣,而对先前的捕获组都不感兴趣,则只需删除所有捕获组中的括号即可,然后使用\ 1。

更新:OP想要2,3,4,8,9,10和12th个字段,因此只需为这些字段添加方括号即可。

Field | Capture Group number
====================================
2     | \1
3     | \2
4     | \3
8     | \4
9     | \5
10    | \6
12    | \7

代码:

select REGEXP_REPLACE(name
,'^name\[[[:alpha:][:space:][:digit:]]*\|\|\|
([[:alpha:]]*)\|\|\|
([[[:alpha:][:space:][:punct:]]*)\|\|\|
([[:digit:][:alpha:]]*)\|\|\|
[[:digit:][:punct:]]*\|\|\|
[[:alpha:][:space:]]*\|\|\|
[[:alpha:]]*\|\|\|
([[:digit:]]*)\|\|\|
([[:alpha:][:space:]]*)\|\|\|
([[:alpha:]]*)\|\|\|
[[:digit:][:alpha:]]*\|\|\|
([[:digit:][:alpha:][:space:]]*)\|\|\|
[[:digit:][:alpha:]]*\|\|\|
[[:alpha:][:space:]]*\|\|\|
[[:alpha:]]*.*','[p1=\1]') as replaced

FROM  Dual

(为了清晰起见,在正则表达式中添加了换行符)

我应该补充一点,看来您要问的更广泛的问题是如何从Oracle中的三重分隔符字符串中获取第十个字段,这可以通过不涉及冗长的正则表达式的其他方式来实现