'[[: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 文字のみが返されます (最初の部分式)。