如何从oracle中的正则表达式中排除单词?

时间:2014-04-12 18:24:46

标签: regex oracle

我有一些表(Oracle DB)和一些产品:

product_1 150
product_2 250
product_1 test 150
product_3
... etc

我希望仅为“product_1”获取数据,而不是仅使用仅一个条件的“product_1测试”。我使用REGEXP_LIKE:

SELECT *
FROM TABLENAME
WHERE REGEXP_LIKE(LOWER(PRODUCT), '.*product_1.*(?!test).*')

但它不起作用并返回空结果。 regexp的语法错在哪里?

2 个答案:

答案 0 :(得分:1)

Oracle不支持前瞻。 使用您展示的产品,您可以使用:

SELECT * FROM TABLENAME WHERE REGEXP_LIKE(PRODUCT, 'product_\d+(\s*\d+)*', 'c');

这仅基于您显示的产品名称。如果它没有抓住你想要的一切,那就让我们更好地了解我们想要匹配的东西。

另一个选择:它是一个黑客,但如果你有信心" product_digits"永远不应该跟着" t",你可以使用它:

SELECT * FROM TABLENAME WHERE REGEXP_LIKE(PRODUCT, 'product_\d+($|\s)($|[^t]).*', 'c');

答案 1 :(得分:0)

只有一个条件:

SELECT * 
FROM TABLENAME 
WHERE 
  REGEXP_INSTR(LOWER(PRODUCT), 'product_1\s') 
  > REGEXP_INSTR(LOWER(PRODUCT), 'product_1\s+test')