Может, так и было задумано разработчиками 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];
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')