2017-05-03 34 views
1

不幸的是\b正则表达式字符在Oracle中不起作用。 b Oracle中的正则表达式字符11g

作为一种变通方法,我发现下面的表达式:

(^|\s|\W)(100100|100101|100102|100103)($|\s|\W) 

(参见:The missing \b regular expression special character in Oracle.),但在测试字符串数据:

Test string 100100/100101, ABC-DEF, 100102 100103 test data abc100100 100100abc. 

100101100103不匹配,而我期待他们被匹配,就像\b表达式那样。

有什么办法可以让它工作吗?我正在使用Oracle 11g。

我将不胜感激的任何帮助。

编辑:

我的目标是标记所有比赛。那我期待的输出是:

Test string [ddd]100100[/ddd]/[ddd]100101[/ddd], ABC-DEF, [ddd]100102[/ddd] [ddd]100103[/ddd] test data abc100100 100100abc. 

在为此我使用下面的语句:

regexp_replace(p_text,'(^|\s|\W)(' || l_ids || ')($|\s|\W)', '\1[ddd]\2[/ddd]\3'); 

其中:

  • l_ids - 由|,ID可分隔的编号列表包含数字,字母,下划线和破折号
  • p_text - 输入文字

编辑2:

在上述试验中字符串值100100不应在字abc100100以及100100abc匹配。

+0

你想输出不同行上的匹配吗? –

+0

第二个'(^ | \ s | \ W)'应该是'($ | \ s | \ W)'。此外'\ s'已经包含在'\ W'中。请注意,第一个数字后面的'/'被第一个模式所消耗,因此不能用于第二个匹配,这在没有预览的情况下很难解决。 –

+0

@vkp请在问题中查看我的编辑。 – kpater87

回答

0

假设 -

  • chr(1)不会出现在文本
  • 任何字符不在[a-zA-Z0-9]被认为是作为分隔符(例如/

with t (p_text) as (select 'Test string 100100/100101, ABC-DEF, 100102 100103 test data abc100100 100100abc.' from dual) 

select replace 
     (
      regexp_replace 
      (
       regexp_replace 
       (
        p_text 
        ,'([a-zA-Z0-9]+)' 
        ,chr(1) || '\1' || chr(1) 
       ) 
       ,chr(1) || '(100100|100101|100102|100103)' || chr(1) 
       ,'[ddd]\1[/ddd]' 
      ) 
      ,chr(1) 
     ) 

from t 

T est字符串[ddd] 100100 [/ ddd]/[ddd] 100101 [/ ddd],ABC-DEF, [ddd] 100102 [ddd] 100103 [/ ddd] test data abc100100 100100abc。

+0

是的,它的工作原理!但这里有一个问题。它不适用于长输入字符串。我的测试表明,第一个'REGEXP_REPLACE'将输出剪切为4000字节(我知道这一点)。但第二个'REGEXP_REPLACE'将输出剪切到1800字节左右,这是我不明白....但使用PL/SQL我可以解决这个问题。谢谢。 – kpater87