0

如何("\\d+\\.*\\d+");在 Oracleregexp_replace函数中使用这个 Java 正则表达式。这在 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
4

3 回答 3

1

Oracle 中的正则表达式应该是\d+?\.*\d+?. 如果您只想要该期间一次,如果有的话,请\d+?\.?\d+?改用。在这里您可以看到更多关于 Oracle 正则表达式的信息。

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

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

于 2012-12-19T01:49:16.217 回答
1

使用replacethenregexp_substrtranslate不是使用regexp_replace

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

sqlfiddle

来自Oracle 数据库 SQL 语言参考 11g 第 2 版 (11.2)

于 2012-12-19T03:35:34.910 回答
0

请注意,Java 的正则表达式风格与 Oracle 的 REGEXP_whatever 函数中使用的风格不同。Java 风格支持更多功能,但它容易受到编写错误的正则表达式的影响,从而导致性能极差。语法也可以有很大不同。换句话说,您不能仅仅因为它在 Java 中工作而期望正则表达式在 Oracle 中工作。从好的方面来说,您不必在 Oracle 中使用那么多反斜杠。

我不精通甲骨文,但我认为这就是你要找的:

SELECT REGEXP_REPLACE(mycolumn, '([[:digit:]]+),([[:digit:]]+)', '\1.\2', 1, 0, 'c') FROM mytable;
于 2012-12-19T03:51:22.330 回答