regexp_like选择属性字符串包含多个不同单词的行

时间:2012-08-15 10:52:22

标签: sql regex oracle select

regexp有点新,并寻求一些帮助,了解一些功能。我目前正在尝试选择一些数据集,这些数据集以一个单词开头,后跟一个空格,然后是几个可能的单词。

示例1: 我基本上希望选择数据,如Product1绿色,Product1红色,Product1蓝色(基本上是绿色,红色或蓝色),但不是: xyz Product1,产品1黑色,产品1白色,产品1垃圾红色。

我尝试了以下查询但收效甚微:

Where regexp_like(item, 'Product1 [green | red | blue]');
Where regexp_like(item, 'Product1 [green, red, blue]');
Where regexp_like(item, '^Product1 [green, red, blue]');

假设有人知道我还可以实现'AND'的方法,例如选择在同一属性中包含单词green和red的项目。

示例2: 类似的情况,但试图在标点后匹配一个单词

Where regexp_like (job, 'Commerce [[:punct:]] .*');

通过此查询,我希望选择具有的作业 商业 - 测试 商业:abcdefg

这些查询没有像我期望的那样工作,我无法弄清楚原因。我假设我误解了这些正则表达式的构造。

非常感谢任何帮助/解释!

1 个答案:

答案 0 :(得分:2)

首先,请尝试以下

WHERE REGEXP_LIKE(ITEM, '^Product1.*(green|red|blue)')

WHERE REGEXP_LIKE(ITEM, '^Product1 (green|red|blue)')

WHERE REGEXP_LIKE(ITEM, '^Product1 +(green|red|blue)')

取决于您在Product1之后的期望 - 第一种情况允许任何类型的零个或多个字符,第二种情况要求Product1之后有一个空格,第三种情况需要一个或Product1之后的更多空白。

不确定你在第二个上的确切位置。如果您真的想要以' Commerce'开头的字符串,后面跟一个空格,后跟一个标点符号,另一个空格,然后是任何内容,请尝试

WHERE REGEXP_LIKE(JOB, '^Commerce [:punct:] .*');

如果不是标点字符,而是您正在寻找':'或' - ',尝试

WHERE REGEXP_LIKE(JOB, '^Commerce [:-] .*');

我在正则表达方面不是很好的专家,但我会尝试提供一些解释:

  • ^要求以下元素位于字符串的开头。因此,在第一种情况下,^Product1表示"'产品1'必须在字符串"。
  • 的开头
  • 在正则表达式中,括号用于对表达式进行分组,因此在第一种情况下(green|red|blue)被组合在一起。
  • |是一个逻辑OR,因此(green|red|blue)表示"必须是' green'之一或者' red'或者' blue'"。
  • 方括号用于字符类。您可以使用预定义的类,例如:punct:或:space:,或者您可以像[:-]中那样组成自己的类。在正则表达式解释期间,方括号字符类(无论多长时间)表示匹配的字符串中的单个字符。因此,在正则表达式^Commerce [:-] .*中,字符类[:-]表示"查找冒号或短划线"。如果你想表明你希望课程中出现多次出现的字符,请在课程结束后使用其中一个重复操作符(*+) - 所以[abc]*会匹配所有abcabcabc

另外请记住,在正则表达式中,每个字符都意味着什么,所以你不能使用空格来使正则表达式更清晰,因为空格会成为解释表达式时要查找的内容。

分享并享受。


修改

之前没有注意到关于AND的问题。将多个表达式组合在一起的简单方法就是将它们一个接一个地放在一起。要查找(绿色|红色|蓝色),然后是空格,然后是(绿色|红色|蓝色)一个简单的表达式

WHERE REGEXP_LIKE(ITEM, '^Product1 (green|red|blue) (green|red|blue)')

如果颜色之间可能存在多个空格

WHERE REGEXP_LIKE(ITEM, '^Product1 (green|red|blue) +(green|red|blue)')

可以使用。

抵抗是没用的。