0

打扫干净 ,

使用 Oracle 11g PL/SQL,对于以下查询,我可以获得捕获组的位置(类似于 Matcher.start() 在 java 中提供的位置)。

    `select regexp_replace('1234bankzone1234', '^..(.*)bank(zone).(.*)..$', '\2') from dual`

结果应如下所示:“区域”,9(文本“区域”的开头)。

我试图解决的更大问题是使用“^.....(.*)..$”等模式屏蔽帐号等数据(此模式可能因安装而异)。

4

2 回答 2

0

像下面这样的东西对你有用吗?

select regexp_replace('1234bankzone1234', '^..(.*)bank(zone).(.*)..$', '\2') expr ,instr('1234bankzone1234',regexp_replace('1234bankzone1234', '^..(.*)bank(zone).(.*)..$', '\2')) pos from dual

或更易读的子查询,例如

select a.*, instr(a.value,a.expr) from ( select '1234bankzone1234' value, regexp_replace('1234bankzone1234', '^..(.*)bank(zone).(.*)..$', '\2') expr from dual ) a

我找不到任何类似 Matcher API 的直接等效功能,并且您无法访问 SQL 中的位置组缓冲区。

于 2012-12-28T19:14:05.163 回答
0

1:使用此反转模式

regexp_replace( regexp_replace( regexp_replace( regexp_replace( regexp_replace( regexp_replace( regexp_replace( regexp_replace( regexp_replace( pattern, '(\()', '\1#') , '(\))', '#\1') , '\(#', ')#') , '\^\)#', '^') , '#\)\$', '$') , '#\)', '(#') , '#', '') , '\^([^\(]+\))', '^(\1') , '\(([^\)]+)\$', '(\1)$');

所以,“^(. )..(.).$”; 变成 "^. (..).(.)$";

2:使用它来批量收集两种模式中的捕获组的索引和计数

SELECT REGEXP_instr(pattern, '\(.*?\)+', 1, LEVEL) bulk collect into posCapture FROM v CONNECT BY LEVEL <= REGEXP_COUNT(pattern, '\(.*?\)');

3:将两种模式与要屏蔽的文本匹配。按步骤 2 中找到的顺序合并它们。

select regexp_replace(v_src, pattern, '\' || captureIndex) into tempStr from dual;

于 2012-12-31T10:40:25.123 回答