工作中遇到过一个这样的问题(PL/SQL中):
有如下类似字符串:vcrRecNaiyo = 'AAA,2013/01/13,"12,345","abc,efg",。。。。'
字符串中包含逗号,还可能存在双引号,半角空格,全角空格。
要求:1.去除双引号
2.去除前后空格(全角,半角)
3.用null代替双引号中的逗号
一开始想用trim,replace来做,试了试不好实现。
最后,在前辈的提示下,使用正则表达式:REGEXP_REPLACE,问题就比较容易解决了。
我的解决方法:
1.以(",)来拆分字符串,把拆分后的内容存放到数组A中
(先计算出字符串中有多少个("),减少循环次数,
loopCnt = NVL(LENGTHB(REGEXP_REPLACE(vcrRecNaiyo,'[^"]', NULL)), 1))
2.以(")来拆分数组A中含有(")的内容,存放到数组B中,包含双引号(实现方法如1)
3.把数组B中含有(")内容的逗号以及(")去掉,不含(")的,以逗号拆分字符串,存放到数组C中
4.去除数组C中的各种空格
REGEXP_REPLACE(数组C(m),'[[:blank:]]',''); (m:循环次数)
结果:AAA,2013/01/13,12345,abcefg,。。。。
由此查了一下真个表达式的相关内容:
ORACLE正则表达式
元字符 | 字符含义 | 举例说明 |
^ | 匹配字符串的开始位置(在[]中使用时,表示不接受该字符集合) | ^a:匹配以a开始的字符串 [^a]:匹配不含a的字符串 |
- | 当使用在a-m表示范围; 当使用在第一个字符时表示连字符串,如[-abc] | |
$ | 匹配字符结束位置 | 'a$':匹配以a结束的字符串 |
. | 匹配除换行符n之外的任何单字符。 | |
? | 匹配前面的子表达式零次或一次 | tr(y(ing)?):可以表示try或者trying |
* | 匹配前面的子表达式零次或多次 | |
+ | 匹配前面的子表达式一次或多次 | |
() | 标记一个子表达式的开始和结束位置 | a(b)*可匹配ab,abb,abbb,youabb |
[] | 标记一个中括号表达式 | [cd]匹配选择c或d等同于(c|d). 匹配的是单字符,[^cd]是匹配c,d之外的单字符。 [a-z]表示所有小写字母。 |
{m,n} | m=<出现次数<=n,'{m}'表示出现m次,'{m,}'表示至少出现m次。 | |
| | 表示或。两个项之间的一个选择 | (c|d).匹配选择c或d |
字符簇 | 字符含义 | |
[[:alpha:]] | 任何字母 | |
[[:digit:]] | 任何数字 | |
[[:alnum:]] | 任何字母和数 | |
[[:space:]] | 任何白字符 | |
[[:upper:]] | 任何大写字母 | |
[[:lower:]] | 任何小写字母 | |
[[:punct:]] | 任何标点符号 | |
[[:xdigit:]] | 任何16进制的数字,相当于[0-9a-fA-F] | |
ORACLE支持正则表达式的内置函数
名称 | 语法 | 备注 |
REGEXP_LIKE | REGEXP_LIKE(source_string, pattern[, match_parameter]) | source_string:源字符串 pattern:正则表达式 match_parameter:匹配模式 例:查询value中以1开头60结束的记录并且长度是7位。(使用like和REGEXP_LIKE) 如果value的值是:201306000000626 select * from fzq where value like '1____60'; 检索数据为0记录 select * from fzq where regexp_like(value,'1....60'); 检索出value值为2013060**的数据 |
REGEXP_REPLACE | REGEXP_REPLACE(source_string, pattern[,replace_string] [,position][,occurtence][,match_parameter]) | replace_string:用于替换的字符串 position:开始搜索的起始位置 occurtence:指定替换第n次出现字符串 |
REGEXP_SUBSTR | REGEXP_SUBSTR( source_string, pattern[,position[,occurrence[,match_parameter]]]) | position:指定字符串中准确位置,默认为1 occurrence:指定在原字符串匹配过程中相对其他字符串,哪个字符串应该匹配。例: select regexp_substr('the zip code 80831 is for falcon, co', '[[:alpha:]]{3,}', 1, 3) from dual 结果:code |
REGEXP_INSTR | REGEXP_INSTR( source_string,pattern[,start_position[,occurrence[,retrun_option[,match_parameter]]]]) | start_position:开始搜索位置 occurrence:第n次出现pattern,默认为1 return_option: 0:pattern的起始位置 1:pattern下一个字符起始位置 默认为0 |
REGEXP_COUNT | REGEXP_COUNT( source_string,pattern[[,start_position][,match_parameter]]) | 11g新增函数,表示pattern在原字符串中出现的次数 start_position:开始搜索的位置 |