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

を使用するのではなく、replaceその後にregexp_substr続いて使用します。translateregexp_replace

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

sqlfiddle

Oracle Database SQL言語リファレンス11gリリース2 (11.2)から:

于 2012-12-19T03:35:34.910 に答える
1

Oracle の正規表現は\d+?\.*\d+?. ピリオドが 1 回だけ必要な場合は、\d+?\.?\d+?代わりに使用します。ここでは、Oracle の正規表現について詳しく説明します。

編集: 各行の完全な正規表現は、最後の番号を取得するための.*?<\d+?,?\d+?>.*?(\d+?\.?\d+?)ものです (正規表現の最後に必要なものをグループ化しています)。

編集 2: 何らかの理由で修飾子*?+?が機能しないように見える場合は?、両方から省略してください。Oracleがその構文を使用しているのに、他の言語がプレーンな*andを使用しているのは非常に奇妙だと思います+

于 2012-12-19T01:49:16.217 に答える
0

Javaの正規表現フレーバーは、OracleのREGEXP_whatever関数で使用されるものと同じではないことに注意してください。Javaフレーバーはさらに多くの機能をサポートしますが、パフォーマンスが極端に低下する可能性のある、不適切に記述された正規表現の影響を受けやすくなっています。構文も大きく異なる可能性があります。つまり、Javaで機能したからといって、正規表現がOracleで機能することは期待できません。プラス面として、Oracleではバックスラッシュをそれほど多く使用する必要はありません。

私はOracleに精通していませんが、これがあなたが探しているものだと思います。

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