使用Oracle REGEXP_INSTR查找确切的单词

时间:2014-07-16 21:37:58

标签: regex oracle

我想使用REGEXP_INSTR从字符串返回以下位置。

我正在寻找以下字符串中完全匹配的单词 car

car,care,oscar - 1
care,car,oscar - 6
oscar,care,car - 12

类似

SELECT REGEXP_INSTR('car,care,oscar', 'car', 1, 1) "REGEXP_INSTR" FROM DUAL;

我不确定使用哪种逃避操作符。

3 个答案:

答案 0 :(得分:1)

更简单的解决方案是用逗号包围源字符串和搜索字符串,并使用INSTR查找位置。

SELECT INSTR(',' || 'car,care,oscar' || ',', ',car,') "INSTR" FROM DUAL;

示例:

SQL Fiddle

with x(y) as (
SELECT 'car,care,oscar' from dual union all
SELECT 'care,car,oscar' from dual union all
SELECT 'oscar,care,car' from dual union all
SELECT 'car' from dual union all
SELECT 'cart,care,oscar' from dual
)
select y, ',' || y || ',' , instr(',' || y || ',',',car,')
from x


|               Y |       ','||Y||',' | INSTR(','||Y||',',',CAR,') |
|-----------------|-------------------|----------------------------|
|  car,care,oscar |  ,car,care,oscar, |                          1 |
|  care,car,oscar |  ,care,car,oscar, |                          6 |
|  oscar,care,car |  ,oscar,care,car, |                         12 |
|             car |             ,car, |                          1 |
| cart,care,oscar | ,cart,care,oscar, |                          0 |

答案 1 :(得分:0)

以下查询处理所有方案。如果字符串以car,开头或整个字符串仅为car,则返回起始位置。如果找到,car,,或者字符串以,car结尾以占用逗号,则返回起始位置+ 1。

SELECT 
  CASE
    WHEN REGEXP_LIKE('car,care,oscar', '^car,|^car$') THEN REGEXP_INSTR('car,care,oscar', '^car,|^car$', 1, 1)
    WHEN REGEXP_LIKE('car,care,oscar', ',car,|,car$') THEN REGEXP_INSTR('car,care,oscar', ',car,|,car$', 1, 1)+1
    ELSE 0
  END  "REGEXP_INSTR"
FROM DUAL;
具有各种可能性的

SQL Fiddle demo

答案 2 :(得分:0)

我喜欢 Noel 他的回答,因为它提供了非常好的表现!另一种方法是从字符分隔的字符串中创建单独的行: pm.nodes = 'a;b;c;d;e;f;g'

(select regexp_substr(pm.nodes,'[^;]+', 1, level) 
   from dual 
connect by regexp_substr(pm.nodes, '[^;]+', 1, level) is not null)