3

文字列を regexp_subtr で分割しようとしていますが、うまくいきません。

だから、最初に、私はこのクエリを持っています

select regexp_substr('Helloworld - test!' ,'[[:space:]]-[[:space:]]') from dual

私の区切り文字を非常にうまく抽出します-空白-空白

しかし、このオプションで文字列を分割しようとすると、うまくいきません。

select regexp_substr('Helloworld - test!' ,'[^[[:space:]]-[[:space:]]]+')from dual

クエリは何も返しません。

助けていただければ幸いです。ありがとう

4

5 に答える 5

9

SQL フィドル

Oracle 11g R2 スキーマのセットアップ:

CREATE TABLE TEST( str ) AS
          SELECT 'Hello world - test-test! - test' FROM DUAL
UNION ALL SELECT 'Hello world2 - test2 - test-test2' FROM DUAL;

クエリ 1 :

SELECT Str,
       COLUMN_VALUE AS Occurrence,
       REGEXP_SUBSTR( str ,'(.*?)([[:space:]]-[[:space:]]|$)', 1, COLUMN_VALUE, NULL, 1 ) AS split_value
FROM   TEST,
       TABLE(
         CAST(
           MULTISET(
             SELECT LEVEL
             FROM   DUAL
             CONNECT BY LEVEL < REGEXP_COUNT( str ,'(.*?)([[:space:]]-[[:space:]]|$)' )
           )
           AS SYS.ODCINUMBERLIST
         )
       )

結果

|                               STR | OCCURRENCE |  SPLIT_VALUE |
|-----------------------------------|------------|--------------|
|   Hello world - test-test! - test |          1 |  Hello world |
|   Hello world - test-test! - test |          2 |   test-test! |
|   Hello world - test-test! - test |          3 |         test |
| Hello world2 - test2 - test-test2 |          1 | Hello world2 |
| Hello world2 - test2 - test-test2 |          2 |        test2 |
| Hello world2 - test2 - test-test2 |          3 |   test-test2 |
于 2015-07-27T15:11:15.900 に答える
1

'[[:space:]]-[[:space:]]'サーカムフレックス (^) を使用して文字クラスに入れて一致文字列を否定しようとしても、うまくいきません。角括弧のペアの間のすべては、オプションの文字のリストに展開される名前付きの名前付き文字クラスを除いて、オプションの単一文字のリストとして扱われますが、文字クラスのネスト方法により、外側の括弧が次のように解釈されます。

  • [^[[:space:]]単一の空白以外の左角括弧以外の文字
  • -単一のハイフンが続く
  • [[:space:]]単一のスペース文字が続く
  • ]+1 つ以上の閉じ角括弧が続きます。

regexp_replace を使用して複数文字の区切り文字を単一の文字に変換し、regex_substr を使用して個々の部分を見つける方が簡単な場合があります。

select regexp_substr(regexp_replace('Helloworld - test!'
                                   ,'[[:space:]]-[[:space:]]'
                                   ,chr(11))
                    ,'([^'||chr(11)||']*)('||chr(11)||'|$)'
                    ,1 -- Start here
                    ,2 -- return 1st, 2nd, 3rd, etc. match
                    ,null
                    ,1 -- return 1st sub exp
                    )
  from dual;

このコードでは、最初-chr(11). これは、ほとんどのテキスト文字列に表示される可能性が低い ASCII 垂直タブ (VT) 文字です。次に、regexp_substr の一致式は、すべての非 VT 文字に一致し、その後に VT 文字または行末が続きます。非 VT 文字のみが返されます (最初の部分式)。

于 2015-07-27T14:58:04.230 に答える
1

私が正しく理解していれば、これはあなたを助けます。現在、出力をHelloworld(最後にスペースを付けて)取得しています。したがって、最後にスペースを入れたくないと思います。その場合は、区切り文字にスペースを使用することもできます。

select regexp_substr('Helloworld - test!' ,'[^ - ]+',1,1)from dual;

OUTPUT
Helloworld(No space at the end)

と を使用して 2 つの列を出力する場合は、コメントで述べたようHelloworldtest!。次のことができます。

select regexp_substr('Helloworld - test!' ,'[^ - ]+',1,1),
       regexp_substr('Helloworld - test!' ,'[^ - ]+',1,3) from dual;

OUTPUT
col1         col2
Helloworld   test!
于 2015-07-27T14:09:31.640 に答える