2012-01-26 2 views
2

Я пытаюсь найти данные с акцентированными символами. Я пробовал:regexp для всех символов с акцентом в Oracle

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

И это работает. Он находит все записи, в которых поле данных XML содержит É. Проблема в том, что он соответствует только верхнему регистру E с акцентом. Я попытался написать более общий запрос, чтобы найти ВСЕ данные с акцентированными гласными (a, e, i, o, u, upper и lowercase с любыми акцентами) с использованием классов эквивалентности. Я хотел, чтобы регулярное выражение соответствовало только акцентированных гласных, но я не уверен, как его получить, поскольку классы эквивалентности, такие как [[=e=]], соответствуют все e's (с или без акцентов).

Кроме того, это на самом деле не работает:

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

(с использованием Oracle 10g)

ответ

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) 

Когда я пытаюсь запустить этот запрос с ударением Е, как скопирован и вставили, матч не может! Я предполагаю, что все, что я скопировал и вставлял, на самом деле другое. Думаю, теперь я ненавижу работать с изменением кодировок.

+1

Это странно; вся причина '[: graph:]' и его ilk заключается в том, чтобы включать символы, отличные от 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

Смежные вопросы