我需要根据以下规则分割字符串
规则1:分割长度为10 char的字符串。
规则2:如果分割字符串的长度大于10,则如果值大于10个字符的长度,则将该字符串除以最后分隔符(,)
Input
Row1 - 01,234,456890,12,3456,7890123,12
Output
Row1 - 01,234,
Row2 - 456890,12,
Row3 - 3456,
Row4 - 7890123,12
我尝试过这个查询,但它被10个字符分割
SELECT distinct regexp_replace('01,234,456890,12,3456,7890123,12',
'(.{10})', '\1' || CHR(13) || CHR(10)) txt
FROM dual
CONNECT BY regexp_substr('01,234,456890,12,3456,7890123,12',
'(.{10})', 1, LEVEL) IS NOT NULL
答案 0 :(得分:0)
更新
好的,如果oracle不能做断言,那么使用这个非断言的断言
注意 - 交替顺序至关重要。
另外,实际上,它匹配字符串中的每个字符。
.{1,10}$|.{0,9},|.{1,10}
格式化
.{1,10} $ # EOS, take the remaining 10
| .{0,9} , # Mid string, 10 total, ending with ,
| .{1,10} # Overflow, take any 10
如果oracle 可以做断言,那么这个正则表达式将特别针对您所声明的内容。
.{1,10}(?:(?=.)(?<=,)|$)|.{1,10}
格式化
.{1,10} # 1 to 10 chars
(?:
(?= . ) # If more than 10
(?<= , ) # require a comma behind
| # or,
$ # End of string
)
| # or,
.{1,10} # Overflow default, just get 10 chars
输出
** Grp 0 - ( pos 0 , len 7 )
01,234,
** Grp 0 - ( pos 7 , len 10 )
456890,12,
** Grp 0 - ( pos 17 , len 5 )
3456,
** Grp 0 - ( pos 22 , len 10 )
7890123,12