2016-04-29 164 views
0

您是否知道Oracle 11g R2速成版(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'會告訴你模式是否匹配。在這種情況下,如果爲true,則會得到'x',否則不會有行。 –

+0

Oracle正則表達式引擎不支持lookahead。如果你想獲取子字符串,我會建議使用'regexp_substr',然後用'regexp_replace'替換不必要的部分。如果你只需要用'regexp_like'來匹配行,你可能根本不需要它們。 –

+0

感謝您的回答,但此命令不會返回任何結果。所以,對我而言,Oracle在正則表達式中沒有意識到(第二個參數)。但是什麼?選擇REGEXP_SUBSTR('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] +?)?(*三叉戟\ /(?!?。[5-9] | 1 [0-9])\ 0)。* $「) 「REGEXP_SUBSTR」來自雙重; – Vince

回答

0

I'm納悶,怎麼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

感謝您的回答。有了!!,它應該被視爲否定。所以,避免選擇三叉戟/數字5至9 + .0(例如:Trident/5.0)或數字1x(其中x = 0至9)(例如:Trident /11.0) – Vince

+0

嗯,我明白了。但是afaik,Oracle Regex不知道負面的前瞻/後視,所以你必須修改你的模式爲''。* MSIE [5-8](\。[0-9] +)?(。 * Trident \ /([^ 5-9] | 1 [0-9])\。0)。* $' – oratom