Статьи

02.03.2008

Особенности использования модификатора g в функции exec

Может, так и было задумано разработчиками JavaScript, но я выявил некоторую особенность при использовании модификатора g в функции exec объекта RegExp. При указании данного модификатора должен осуществляться глобальный поиск всех совпадений, но на практике ищется только первое.

Например, в данном примере паттерн совпадает с подстроками 'abc', 'abcc' и 'abccc', а на практике возвращает только первое совпадение 'abc'. Переменные vSecondSame и vThirdSame будут неопределенны.

vArr = /abc+/g.exec("abc abcc abccc"); 
vFirstSame = vArr[0];
vSecondSame = vArr[1];
vThirdSame = vArr[2];

При использовании аналогичного по своей специфике метода match объекта String, модификатор g работает как положено. Т.е. в следующем примере, переменная vFirstSame равна 'abc', vSecondSame будет содержать 'abcc' и vThirdSame соответственно 'abccc'.

vArr = "abc abcc abccc".match(/abc+/g); 
vFirstSame = vArr[0];
vSecondSame = vArr[1];
vThirdSame = vArr[2];
02.03.2008

Регулярные выражения в Oracle

Oracle 10g и выше поддерживает регулярные выражения. В частности функция REGEXP_LIKE. Я не проверял насколько быстрее двухстороннего LIKE, работает регулярное выражение в Oracle, но приведу пример, когда выигрыш в производительности в десятки раз.

Надо было сделать запрос, где не обойтись без пяти двухсторонних LIKE:

select * 
from t_table
where name like '%subname1%'
and name like '%subname2%'
and name like '%subname3%'
and name like '%subname4%'
and name like '%subname5%'

Используя REGEXP_LIKE, можно получить элегантный код работающий намного быстрее:

select * 
from t_table
where REGEXP_LIKE(name,'subname1|subname2|subname3|subname4|subname5')
Сайт создан в системе uCoz