регулярное выражение для всех акцентированных символов в Oracle - PullRequest
2 голосов
/ 26 января 2012

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

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

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

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

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

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

Ответы [ 2 ]

2 голосов
/ 26 января 2012

После еще нескольких экспериментов я обнаружил, что это работает нормально:

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 как скопированной и вставленной, совпадение не удаётся!Я думаю, все, что я скопировал и вставил, на самом деле отличается.Тьфу, я думаю, что теперь я ненавижу работать с изменением кодировки символов.

2 голосов
/ 26 января 2012

Как насчет

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

?Это исключит любые безударные гласные перед исполнением REGEXP_LIKE.

(это ужасно, я знаю. Но это должно сработать.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...