如何在Oracle regexp_replace中使用Java正则表达式

时间:2012-12-19 01:39:58

标签: java sql regex oracle

如何在Oracle ("\\d+\\.*\\d+");函数中使用此Java正则表达式regexp_replace。这在Java中运行良好,但对于Oracle,它无法正常工作。

示例数据:

<Tier><grade><><sdlc><17,10><> : result should be 17.10
<><sdlc><16,909312> : 16.909312
<><sdlc><11396,87> : 11396.87
<20121217> : 20121217
<UNIT><6086> : 6086
<Tier1><><sdlc><0,47> : 0.47

3 个答案:

答案 0 :(得分:1)

Oracle中的正则表达式应为\d+?\.*\d+?。如果您只需要一段时间,请使用\d+?\.?\d+?代替。 Here您可以看到有关Oracle regexp的更多信息。

编辑:每行的完整正则表达式,只是为了得到最后的数字,应该是.*?<\d+?,?\d+?>.*?(\d+?\.?\d+?)(我在正则表达式的末尾对你需要的内容进行分组)。

编辑2:如果由于某种原因,限定符*?+?似乎不起作用,请忽略两者中的?。我发现Oracle使用该语法非常奇怪,而其他语言使用普通*+

答案 1 :(得分:1)

使用replace然后使用regexp_substr,然后使用translate,而不是使用regexp_replace

select translate(regexp_substr(replace(str, ',>', '>')
        , '<[[:digit:]]+(,[[:digit:]]*)?>')
    , ',<>', '.')
from so

sqlfiddle

来自Oracle Database SQL Language Reference 11g Release 2 (11.2)

答案 2 :(得分:0)

请注意,Java的正则表达式风格与Oracle的REGEXP_whatever函数中使用的风格不同。 Java flavor支持更多功能,但它容易受到写得很糟糕的正则表达式的影响,导致性能极差。语法也可能有很大不同。换句话说,你不能指望正则表达式在Oracle中工作只是因为它在Java中工作。从好的方面来说,您不必在Oracle中使用尽可能多的反斜杠。

我不熟悉Oracle,但我认为这正是您所需要的:

SELECT REGEXP_REPLACE(mycolumn, '([[:digit:]]+),([[:digit:]]+)', '\1.\2', 1, 0, 'c') FROM mytable;