如何在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
答案 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
来自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;