2015-08-26 35 views
0

我想在使用Oracle的字符串中找不到分隔符**之后返回NULL值。我有串如何在正则表达式中返回NULL

first path**second path 

我想定界符**后切断绳子,我用这个正则表达式

REGEXP_SUBSTR(str , '[^**]*$') 

结果是correct.It回报second path。但我需要的是当字符串没有分隔符**(例如firstpathsecondpath)并且需要返回NULL。我应该改变我的正则表达式?目前,当没有分隔符**时,正则表达式返回整个字符串。

+1

只是一句话:您的正则表达式不正确 - 它匹配字符串末尾的任何非星号字符序列(您可以用'third * fourth'测试它 - 它会返回'fourth')。 –

+0

@FrankSchmitt不,我已经测试了你说的。它返回NULL –

+0

不,它不会:'从双'返回'第四''选择REGEXP_SUBSTR('第三*第四','[^ **] * $')。 –

回答

4

这个查询将返回NULL,如果两个星号后跟一些文本没有在源字符串中发现:

WITH t AS (SELECT 'first path**second path' text FROM DUAL 
      UNION 
      SELECT 'third pathfourth path' text FROM DUAL) 
SELECT SUBSTR(REGEXP_SUBSTR(t.text,'(\*{2})(.+)'),3) 
FROM t 
+0

请注意,'[* * \ *] {2}'相当于'\ * {2}'或'\ * \ *'。 –

+0

完全索尼@AndreaCorbellini。编辑。 – pablomatico

1

当没有匹配时,您会得到原始字符串。使用select case,测试double-splat。发现时,返回的第二部分,不用时,返回NULL:

SQL> with tbl(rownbr, str) as (
    select 1, 'first path**second path' from dual 
    union 
    select 2, 'third pathfourth path' from dual 
    ) 
    select rownbr, str, case REGEXP_INSTR(str , '\*\*') 
    when 0 then 
     NULL 
    else 
     REGEXP_SUBSTR(str , '[^**]*$') 
     end data 
    from tbl; 

    ROWNBR STR      DATA 
---------- ----------------------- ----------------------- 
     1 first path**second path second path 
     2 third pathfourth path 

SQL>