我需要一种方法,使用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。
答案 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
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" |