一尘不染

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

sql

我正在尝试查找带有重音符号的数据。我已经试过了:

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

而且有效。它查找XML数据字段包含where的所有记录。问题在于它仅将大写字母E与重音符匹配。我试图编写一个更通用的查询,以使用对等类查找带有重音元音(a,e,i,o,u,大写和小写以及任何重音)的所有数据。我想要一个正则表达式
匹配重音元音,但是我不确定如何获取它,因为等价类(例如[[=e=]]匹配 所有 e的(带或不带有重音))都可以。

另外,这实际上不起作用:

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

(使用Oracle 10g)


阅读 165

收藏
2021-03-08

共1个答案

一尘不染

经过更多的实验后,我发现这似乎行得通:

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

我以为这[:graph:]会包括 所有 带有或不带有重音符号的大写和小写字符,但似乎它只匹配未 重音的 字符。


进一步的实验表明,这可能并非在所有情况下都有效。尝试以下查询:

select *
from dual
where regexp_like (unistr('\0090'),'[^[:graph:][:space:]]');



假的
-------
X
(比赛成功)

所以看起来导致我麻烦的角色与此模式匹配。

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



假的
-------

(比赛失败)

当我尝试使用带重音符号E的复制粘贴语句运行此查询时,匹配失败!我想我复制粘贴的内容实际上是不同的。gh,我想我现在讨厌更改字符编码。

2021-03-08