2012-01-26 67 views
2

我正在嘗試查找具有重音字符的數據。我試過這個:對於Oracle中所有重音字符的正則表達式

select * 
from xml_tmp 
where regexp_like (XMLTYpe.getClobVal(xml_tmp.xml_data), unistr('\0090')) 

它的工作原理。它查找XML數據字段包含É的所有記錄。問題在於它只能用重音符合大寫字母E.我嘗試編寫一個更通用的查詢來使用等價類來查找帶有重音元音的所有數據(a,e,i,o,u,大寫和小寫,以及任何重音符號)。我想要一個正則表達式匹配只有重音元音,但我不知道如何得到它,因爲等效類如[[=e=]]匹配全部 e(有或沒有重音符號)。

而且,這不實際工作:

select * 
from xml_tmp 
where regexp_like (XMLTYpe.getClobVal(xml_data),'É'); 

(使用Oracle 10g)

回答

2

經過一些實驗,我發現,這似乎OK工作:

select * 
from xml_tmp 
where regexp_like(XMLTYpe.getClobVal(xml_data),'[^[:graph:][:space:]]') 

我原以爲[:graph:]將包括全部大小寫字母,帶或不帶口音,但看起來它只匹配不帶空格的個字符。


進一步的實驗表明,這可能不適用於所有情況。試試這些查詢:

select * 
from dual 
where regexp_like (unistr('\0090'),'[^[:graph:][:space:]]'); 
 
DUMMY 
------- 
X 
(the match succeeded) 

所以它看起來像一個已經引起了我的麻煩此模式匹配的字符。

select * 
from dual 
where regexp_like ('É','[^[:graph:][:space:]]'); 
 
DUMMY 
------- 

(the match failed) 

當我嘗試與作爲複製和粘貼的重音E運行此查詢,匹配失敗!我想我所複製和粘貼的內容實際上是不同的。呃,我想我現在討厭改變字符編碼。

+1

這是奇怪的; 「[:graph:]」的全部原因就是包含非ASCII字符。這很好理解! – ruakh

+0

@ruakh:我以前從來沒有使用過'[:graph:]',所以我確定這是它應該如何工作,或者它只是一些奇怪的環境設置導致它的行爲。 – FrustratedWithFormsDesigner

+0

奇怪的是我試過'regexp_like(xml_data,'[\ x80- \ xFF]')',它什麼也沒有返回。我認爲這一定會奏效。 – FrustratedWithFormsDesigner

2

如何

SELECT * 
    FROM xml_tmp 
WHERE REGEXP_LIKE 
     (REGEXP_REPLACE 
      (XMLTYpe.getClobVal(xml_tmp.xml_data), 
      '[aeiouAEIOU]', 
      '-' 
     ) 
      '[[=a=][=e=][=i=][=o=][=u=]]' 
     ) 
; 

?在執行REGEXP_LIKE之前,這將消除任何不重複的元音。

(這是醜陋的,我知道,但它應該工作。)

+0

我相信這應該工作(好吧,它缺少一個逗號,但我修復了它),雖然它現在已經運行了幾分鐘,然後當我試圖殺死它PL/SQL Developer掛起...一些XML對象是相當大的...:/ – FrustratedWithFormsDesigner