使用Oracle 11g PL / SQL限制双引号之间的字符数

时间:2014-08-18 02:04:38

标签: sql regex oracle oracle11g substring

我需要一种方法,使用Oracle 11g PL / SQL为双引号内的每组数据应用32个字符的子字符串限制。

基本上使用以下提供给我的示例字符串,因为我无法控制此字符串的构造方式:

str := ‘"AAAAAAA BBBBBBB CCCCCCC DDDDDD1","AAAAAAA BBBBBBB CCCCCCC DDDD",”QWERTY”,”N1N1N1N1N1N1N1N1N1N1N1N1N1N1N1N1N1N1”’;

我需要遍历每个双引号之间的每组值,例如(“QWERTY”)并将32的子字符串应用于找到的每个分组。

所以使用上面的字符串示例,就像我需要执行以下操作:

str := ‘"substr(‘AAAAAAA BBBBBBB CCCCCCC DDDDDD1’,1,32)","substr(‘AAAAAAA BBBBBBB CCCCCCC DDDD’,1,32)",”substr(‘QWERTY’,1,32)”,”substr(‘N1N1N1N1N1N1N1N1N1N1N1N1N1N1N1N1N1N1’,1,32)”’;

所以最后,我对str的最终结果将包括四个分组,每个分组的长度小于或等于32。

1 个答案:

答案 0 :(得分:1)

您可以使用regexp_replace

regexp_replace(str,'"([^"]{1,32})[^"]*"','"\1"')

模式说明:

"               --matches a double quote
([^"]{1,32})    --matches a group of 1 to 32 characters, containing anything other than double quotes.
                --surrounded by brackets, to form the first capture group.
[^"]*           --matches zero or more characters other than double quotes
"               --matches a double quote

SQL Fiddle

with x(str) as (
select '"AAAAAAA BBBBBBB CCCCCCC DDDDDD1","AAAAAAA BBBBBBB CCCCCCC DDDD","QWERTY","NoN1N1N1N1N1N1N1N1N1N1N1N1N1N1N1N1N1"' str
from dual
)
select str,
regexp_replace(str,'"([^"]{1,10})[^"]*"','"\1"')
from x

<强> Results

|                                                                                                              STR | REGEXP_REPLACE(STR,'"([^"]{1,10})[^"]*"','"\1"') |
|------------------------------------------------------------------------------------------------------------------|--------------------------------------------------|
| "AAAAAAA BBBBBBB CCCCCCC DDDDDD1","AAAAAAA BBBBBBB CCCCCCC DDDD","QWERTY","NoN1N1N1N1N1N1N1N1N1N1N1N1N1N1N1N1N1" |  "AAAAAAA BB","AAAAAAA BB","QWERTY","NoN1N1N1N1" |