2016-10-06 37 views
4

我在甲骨文SQL測試正則表達式的工作,並發現了一些我無法理解:甲骨文REGEXP_LIKE無法如預期那樣

-- NO MATCH 
SELECT 1 FROM DUAL WHERE REGEXP_LIKE ('Professor Frank', '(^|\s)Prof[^\s]*(\s|$)'); 

以上不匹配,而下面的比賽:

​​

在其他正則表達式中,它將類似於\bProf[^\s]*\b\bProf\S*\b並且具有類似的結果。注意:Oracle SQL正則表達式不具有\b或字邊界。

問:爲什麼[^\s]*\S*在Oracle SQL中以相​​同的方式工作?

我注意到如果我在最後刪除(\s|$),第一個正則表達式將匹配。

+1

如果用第一個示例中的空格替換字符類中的\ s,它將按預期工作。有趣的是,我希望在\ s中包含一個空格字符! –

+0

嘗試從字符串中跳出反斜槓,例如'\\ s' – Barmar

+1

\ s是空格的轉義序列,但不是匹配的字符集(即[.....])。在匹配字符集中,只有兩個字符具有特殊含義, - 對於範圍和]用於關閉範圍。他們不能逃脫;如果在匹配集中需要,]必須始終是第一個字符,並且 - 必須是第一個或最後一個(最好將它始終保留到匹配集的末尾)。 – mathguy

回答

3

在Oracle正則表達式中,\s確實是空格的轉義序列,但不是匹配的字符集(即[.....][^....]不包含一個字符)。在匹配字符集中,只有兩個字符具有特殊含義,範圍爲-,關閉集合枚舉爲]。他們不能逃脫;如果在匹配集合中需要,]必須始終爲開頭後的第一個字符[(這是閉合]代表自己爲字符的唯一位置,並且不表示匹配集合的結尾),並且-必須是第一個或最後一個(最好將它始終保留在匹配集的末尾) - 在任何其他地方,它都被視爲範圍標記。要包括(或者如果使用[^.....]語法,請排除)空格,只需在匹配集中鍵入實際物理空間。

編輯:我上面說的不完全正確。匹配集中還有另一個特殊字符,即^。如果它在第一個位置使用,則表示「匹配其他任何角色」。在任何其他立場中,它都代表着自己。例如,'[^^]'將匹配除^以外的任何單個字符(第一個^具有特殊含義,第二個字符表示自身)。而且,如果第一個字符是^(具有其特殊含義),則括號內的第二個字符即爲括號]。也就是說,要匹配除]以外的任何單個字符,我們可以使用匹配模式'[^]]'

+1

要排除所有空格字符(製表符,換行符,垂直製表符,換頁符,回車符或空格),可以使用POSIX字符類,例如'[^ [:space:]]' – Unoembre

+0

@Unoembre所以它確實如此。我認爲Oracle不允許perl擴展(像大多數其他正則表達式實現)那麼一個bug! :-b您已經進入Oracle區域..... –

+0

@Gary_W - 「錯誤」與文檔所說的內容有所不同,所以這不是一個錯誤。也許你不同意Oracle的選擇,那是另一回事。另外,Oracle確實允許perl擴展(顯然,因爲'\ s'被識別在匹配集之外!) - 請參閱https://docs.oracle.com/cd/B19306_01/server.102/b14200/ap_posix003.htm – mathguy