工作中遇到过一个这样的问题(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:开始搜索的位置