正则表达式

时间:2018-04-03 15:12:20

标签: sql string oracle plsql

我有以下代码:

DECLARE

r_blob_data VARCHAR2(4000);
r_length NUMBER;
r_payor_identifer VARCHAR2(100);
clp07_ctx NUMBER;

BEGIN

r_blob_data := 'ISA*00*          *00*          *ZZ*HCA835EOB      *ZZ*BOFAECSUSO     *170726*1513*U*00401*835013201*1*P*~\GS*HP*HCA835EOB*BOFAECSUSO*20170726*1513*13201*X*004010X091A1\ST*835*000000547\BPR*C*7.01*C*ACH*CTX*01*061000052*DA*3299975294*3621796494**01*122105744*DA*2500335303*20170728\NTE*ZZZ*SEE OUR WEBSITE @HEALTHCHOICEAZ.COM FOR INFORMATION ON CLAIMS DISPUTERESOLUTION\\DTM*405*20170728\N1*PR*HEALTH
CHOICE ARIZONA\N3*410 NORTH 44TH ST, SUITE 900\N4*PHOENIX*AZ*850080000\N1*PE*FL
AGSTAFF MEDICAL CT DBA*FI*860110232\N3*PO BOX 29435\N4*PHOENIX*AZ*850389435\LX*1
\CLP*10906801*1*22*7.01*0*HM*719281738*22\CLP*10906802*1*23*8.01*0*HM*719281739*
22\NM1*QC*100080033001*CLAIRITY*MICHAEL*E***MR*A77240030\NM1*82*2*FLAGSTAFF MEDI
CAL CT DBA TRAUM*****F*86-0110232\REF*1W*A77240030\AMT*AU*7.01\SVC*HC|93010*22*7
.01**1\DTM*472*20170616\CAS*CO*45*14.58\AMT*B6*7.01\SE*22*000000547\GE*1*13201\I
EA*1*835013201\ ';

select regexp_count(r_blob_data, 'CLP')
into r_length
from dual;

dbms_output.put_line('Number of CLP = '||r_length);

for i in 1 .. r_length
loop

SELECT instr(r_blob_data, 'CLP')
INTO clp07_ctx
FROM dual;

dbms_output.put_line('Clp07_ctx = '||clp07_ctx);

 r_payor_identifer := substr(r_blob_data, instr(r_blob_data, '*',clp07_ctx,7)+1,instr(r_blob_data,'*',clp07_ctx,8)-instr(r_blob_data,'*',clp07_ctx,7)-1);
r_payor_identifer := to_char(r_payor_identifer) + to_char(r_payor_identifer);
dbms_output.put_line('CLP07String = '||r_payor_identifer);
end loop;
dbms_output.put_line('CLP07String = '||r_payor_identifer);
END;

我要做的是计算CLP段的出现次数(一个段是例如,CLP * 10906801 * 1 * 22 * 7.01 * 0 * HM * 719281738 * 22)并拉出值等价于CLP值7,在这种情况下,两次出现的值均为719281738,并将r_payor_identifer变量输出为" 719281738719281738"。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

试试这个REGEXP模式:'CLP[^\\]+\*(\d+)\*'来提取719281738和 来自你的字符串的719281739

匹配CLP后跟除\以外的任何内容  最后*..*

之间的数字
select REGEXP_SUBSTR(r_blob_data, 'CLP[^\\]+\*(\d+)\*' , 1 ,LEVEL, NULL,1) as clp 
FROM t 
CONNECT BY LEVEL <= REGEXP_COUNT(r_blob_data,'CLP[^\\]+');

另外,要设置r_payor_identifer,请使用||进行连接,而不是+

Demo