2015-04-03 57 views
2

我有一個正則表達式,它正在尋找與我們有效字符的白名單不匹配的字符。實際上,這是在文本列中查找錯誤的數據。這似乎是在換行匹配:爲什麼此Oracle正則表達式匹配換行符?

SELECT REGEXP_SUBSTR (text_col, '[^A-Za-z0-9()\\*+=.,:\/!%#\n\r&''\"@?\ -]+') 
      AS match_text 
    FROM text_table 
WHERE REGEXP_LIKE (text_col, '[^A-Za-z0-9()\\*+=.,:\/!%#\n\r&''\"@?\ -]+') 

爲什麼是包含所有要退回的有效字符行和match_text只是在這些情況下(或多個新行)換行?

+0

這將是有益的,如果你提供一些數據的例子,無論是其應該和不應該匹配的行。謝謝。 – 2015-04-03 15:27:32

+0

'abc?'應該匹配,'abc''不應該。唯一真正的問題是換行符。 – Randyaa 2015-04-03 15:32:13

+0

也許try \ x0a和\ x0d換行而不是(或者除了)\ n和\ r? – Paul 2015-04-03 15:53:13

回答

0

嘗試使用[:space:]而不是轉義的換行符/回車符。它匹配「空格字符(非打印),如回車符,換行符,垂直製表符和換頁符」。 Reference

您應該結束了的東西,如:

[^A-Za-z0-9()\\*+=.,:\/!%#[:space:]&''\"@?\ -]+ 
+0

這有效。它最終不符合最初的願望(即:標籤等),但對於我的目的來說,現在可以。理想情況下,我想提出一個與選項卡匹配的解決方案,但\ n或\ r – Randyaa 2015-04-06 12:48:32

+0

然後讓我們將我們需要的字符連接到正則表達式中。 'SELECT REGEXP_SUBSTR(text_col,'[^ A-Za-z0-9()\\ * + =。,:\ /!%#\ n \ r&''\「@?\ - '|| CHR(10) || CHR(13)||'] +') AS match_text FROM text_table WHERE REGEXP_LIKE(text_col,'[^ A-Za-z0-9()\\ * + =。,:\ /!%# \ n \ r''「@?' - '|| CHR(10)|| CHR(13)||'] +')' – Paul 2015-04-06 13:46:03

+0

我還沒有想出爲什麼但是這會產生oracle錯誤:錯誤]執行(11:60):ORA-12728:正則表達式中的無效範圍 – Randyaa 2015-04-06 13:54:20

相關問題