2016-04-29 21 views
0

Oracle 11g R2 Express Edition(XE)のこのSQLコマンドが期待した結果を返さない理由を知っていますか?Oracle SQL REGEXP_LIKEが予期しない結果を返さない

SELECT 'X' 
FROM dual 
WHERE REGEXP_LIKE('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)', '^.*MSIE [5-8](?:\.[0-9]+)?(?!.*Trident\/(?:[5-9]|1[0-9])\.0).*$'); 

私はサイトhttps://regex101.com/は、パターンが一致した使用...

+0

実際に一致するには 'regexp_substr'を使うべきです。 'regexp_like'を使うと、パターンが一致したかどうかを知ることができます。この場合、真であれば 'x'、それ以外の場合には行はありません。 –

+0

Oracle regexエンジンは先読みをサポートしていません。部分文字列を取得しようとしていたら、 'regexp_substr'を使い、' regexp_replace'を使って不要な部分を置き換えることをお勧めします。 'regexp_like'と行をマッチさせるだけであれば、おそらくそれらは必要ありません。 –

+0

あなたの答えをありがとうが、このコマンドは何も返しません。ですから、私にとっては、Oracleが正規表現で認識しないものがあります(2番目の引数)。しかし何? [MSIE 8.0、Windows NT 5.1、Trident/4.0、.NET CLR 2.0.50727、.NET CLR 3.0.4506.2152、.NET CLR 3.5.30729] '、*。* MSIE [ Trident \ /(?:[5-9] | 1 [0-9])\。0)。* $ ')(5-8)(?:\。[0-9] +)デュアルから "REGEXP_SUBSTR"; – Vince

答えて

0

- 私疑問に、regexe101を一致させることができますどのように、あなたが "...トライデント/ 4.0 ..." を探しているためパターンはスラッシュの後に5と9の間の数字しか期待していません(これは確かに4を含まないので、regex101は一致しません!)。

とにかく、これを修正して、それを削除した後、?と:!修飾子は実際には11gR2(および12cでも)で正しく処理されません。

SELECT 'X' 
FROM dual 
WHERE REGEXP_LIKE(
    'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)' 
    , '^.*MSIE [5-8](?:\.[0-9]+)?(.*Trident\/([4-9]|1[0-9])\.0).*$'); 
+0

あなたの答えをありがとう。 ?と、それは否定と見なされることになっていた。したがって、Trident /の選択を避けてください。5から9 +0(例:Trident/5.0)または1x(ここでx = 0から9)の数字を使用してください(例:Trident/11.0) – Vince

+0

ああ、しかし、Oracle Regexは否定的な先読み/見た目のヒントについて知らないので、あなたのパターンを ''*。* MSIE [5-8](\。[0-9] +)?(。 * Trident \ /([^ 5-9] | 1 [0-9])\。0)。* $ ' – oratom