Oracle中所有重音字符的正则表达式

时间:2012-01-26 15:35:23

标签: sql regex oracle character-encoding

我正在尝试查找具有重音字符的数据。我试过这个:

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 个答案:

答案 0 :(得分:2)

怎么样

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

?这将在执行REGEXP_LIKE之前消除任何无重音元音。

(这很难看,我知道。但它应该有效。)

答案 1 :(得分:2)

经过一些实验,我发现这似乎没问题:

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

我原以为[:graph:]会包含所有大写和小写字符,有或没有重音符号,但它似乎只匹配 unaccented 字符。


进一步的实验表明,这可能并不适用于所有情况。试试这些问题:

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复制并粘贴时运行此查询时,匹配失败!我猜我复制和粘贴的东西实际上是不同的。呃,我想我现在讨厌改变角色编码。