2015-03-26 2 views
3

У меня есть набор строк в моей базе данных со значениями VARCHAR2 столбцов, как так: tac903.2, tac903.24, tac903.2a, tac903.2bOracle REGEXP_LIKE матч нечисловой символ

Я хочу, чтобы создать regex, который не совпадает, если последний символ в выражении поиска является числовым. Поэтому, когда я ищу «tac903.2», я хочу только соответствовать: tac903.2, tac903.2a и tac903.2b. Это должно быть простым, но я не получаю желаемое поведение моего регулярного выражения здесь:

REGEXP_LIKE(col, 'tac903.2[a-z]?'); //This is matching the tac903.24 record. 

REGEXP_LIKE(col, 'tac903.2[^0-9]?'); //This also is matching the tac903.24 record. 

Я новичок с регулярными выражениями, но на основе своих исследований, кажется, как выше должен достигнуть поведения I» м ищет. Может кто-нибудь сказать мне, что с ними не так?

ответ

0

Здесь вы можете использовать word boundary[[:>:]].

Что-то вроде этого REGEXP_LIKE(col, 'tac903.2[a-z]?[[:>:]]');

Посмотреть демо.

http://www.sqlfiddle.com/#!9/940fd/2/0

РЕДАКТИРОВАТЬ:

`REGEXP_LIKE(col, 'tac903.2[a-z]?(\s|$|\W)');` 
+0

Я вижу, что это работает в демонстрации, которую вы опубликовали, но в oracle «:>:» не распознается как класс символов. Спасибо за ваш ответ, хотя! – user3923442

+0

Oracle regex не поддерживает границы слов, будь то регулярная сортировка ('\ b') или POSIX-стиль (' [[: <:]] и '[[:>:]]'). –

+0

@ user3923442 check Редактировать – vks

4

Настройка образец данных:

create table temp_matches (
    rec varchar2(10) 
); 

insert into temp_matches values ('tac903.2'); 
insert into temp_matches values ('tac903.2a'); 
insert into temp_matches values ('tac903.2b'); 
insert into temp_matches values ('tac903.24'); 
insert into temp_matches values ('2'); 
insert into temp_matches values ('a'); 

Запрос:

select * 
from temp_matches 
where REGEXP_LIKE(rec, '(.)*[^0-9]$'); 

Результаты:

tac903.2a 
tac903.2b 
a 

$ указывает конец линии, поэтому мы просто ищем любые значения, не заканчивающиеся на 0-9.

+0

Спасибо! Я вижу, что мне нужно было явно указать конец строки в моем регулярном выражении, чтобы получить поведение, которое я хотел. – user3923442

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