1

REGEXP_SUBSTR()Oracleの関数を使用して、テキストフィールドから分数を抽出しようとしています。

データ:

Treatment of PC7, PT1 on left. 15 min.
15 minutes.
15 minutes
15 mins.
15 mins
15 min.
15 min
15min
15

いずれの場合も、文字列の「15」の部分を抽出したいと思っています。

試み:

  • \d+「7」と「1」を含むすべての数値を取得しますが、これは望ましくありません。
  • (\d)+(?=\ ?min)最後を除くすべての行から「15」を取得します。
  • (?((\d)+(?=\ ?min))((\d)+(?=\ ?min))|\d+)、条件文は、何にも一致しません。

私の条件文の何が問題になっていますか?

** 編集 **

WITH DATA AS (

  SELECT 'Treatment of PC7, PT1 on left. 15 min.' COMMENTS FROM DUAL

  UNION ALL

  SELECT '15 minutes.' COMMENTS FROM DUAL

  UNION ALL

  SELECT '15 minutes' COMMENTS FROM DUAL

  UNION ALL

  SELECT '15 mins.' COMMENTS FROM DUAL

  UNION ALL

  SELECT '15 mins' COMMENTS FROM DUAL

  UNION ALL

  SELECT '15 min.' COMMENTS FROM DUAL

  UNION ALL

  SELECT '15 min' COMMENTS FROM DUAL

  UNION ALL

  SELECT '15min' COMMENTS FROM DUAL

  UNION ALL

  SELECT '15' COMMENTS FROM DUAL

)

SELECT  COMMENTS,
        REGEXP_SUBSTR(COMMENTS, '(\d+)\s?(?:min.*)?$', 1, 1) A,
        REGEXP_SUBSTR(COMMENTS, '\d+?(?= ?min)|^\d+$', 1, 1) B,
        REGEXP_SUBSTR(COMMENTS, '\d+?(?: ?min)|^\d+$', 1, 1) C

FROM DATA

結果(「コードサンプル」としてよりも列をフォーマットするためのより良い方法が必要です):

COMMENTS A B C
Treatment of PC7, PT1 on left. 15 min.          
15 minutes.         
15 minutes          
15 mins.            
15 mins         
15 min.         
15 min          
15min           
15  15  15  15
4

3 に答える 3

3

この正規表現はあなたのために働きます。

^.*?(\d+)(( ?min.*$)|$)

説明

  • ^.*?-文字列の先頭に一致し、その後に任意の文字が0回以上続く
  • (\d+)-少なくとも1桁に一致し、後方参照位置1に格納します
  • ( ?min.*$)-スペース(多分)min、任意の文字(多分)、そして文字列の終わりに一致します。
  • (...|$)-が見つからないmin場合は、代わりに文字列の終わりがあるかどうかを確認します。

次に、を使用する代わりに、次のようREGEXP_SUBSTR()に使用しREGEXP_REPLACE()て、文字列全体を後方参照位置1(あなたの番号)に格納されているものに置き換えます。

REGEXP_REPLACE(COMMENTS, '^.*?(\d+)(( ?min.*$)|$)', '\1') A
于 2012-11-06T17:08:33.090 に答える
1

タイムスタンプが常に文字列の最後の部分として表示されることを保証できる場合、これは機能します。

(\d+)\s?(?:min.*)?$

Oracleが非キャプチャグループをサポートしているかどうかはわかりませんが、簡単に回避できます。私の経験では、RegExpエンジンは非常にバニラなものに限定されています。

于 2012-11-06T17:12:32.830 に答える
0

複数の表現を使用する代替の実用的なソリューション:

TO_NUMBER(
    CASE
        -- number only
        WHEN LENGTH( REGEXP_SUBSTR(MEAS_COMMENT, '^\d+$', 1, 1) ) >0 THEN REGEXP_SUBSTR(MEAS_COMMENT, '^\d+$', 1, 1)
        -- XX min
        WHEN LENGTH( REGEXP_SUBSTR(MEAS_COMMENT, '\d+( ?min)', 1, 1) ) >0 THEN REGEXP_SUBSTR(REGEXP_SUBSTR(MEAS_COMMENT, '\d+( ?min)', 1, 1), '\d+', 1, 1)
    END
) MINUTES

** 編集 **

-- same results without the `CASE` statement:
TO_NUMBER( REGEXP_SUBSTR(REGEXP_SUBSTR(COMMENTS, '(\d+)( ?min|$)', 1, 1), '\d+', 1, 1) )
于 2012-11-06T18:57:08.077 に答える