3

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

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

我尝试了以下查询但没有多大成功:

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:]] .*');

通过此查询,我希望选择具有 Commerce - test Commerce 的工作:abcdefg

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

任何帮助/解释将不胜感激!

4

1 回答 1

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意味着“'Product1' 必须位于字符串的开头”。
  • 在正则表达式中,括号用于对表达式进行分组,因此在第一种情况下(green|red|blue)被组合在一起。
  • |是一个逻辑或,所以(green|red|blue)意思是“必须是‘绿色’或‘红色’或‘蓝色’之一”。
  • 方括号用于字符类。您可以使用预定义的类,例如 :punct: 或 :space:,或者您可以像在[:-]. 在正则表达式解释期间,方括号字符类,无论多长,都表示正在匹配的字符串中的单个字符。因此,在正则表达式^Commerce [:-] .*中,字符类的[:-]意思是“查找冒号或破折号”。如果您想表明您希望在类中一个接一个地出现多个字符,请在类之后使用重复运算符之一(*+) - 这样[abc]*将匹配所有abcabcabc.

还要记住,在正则表达式中,每个字符都意味着某种东西,因此您不能使用空格来使正则表达式更易读,因为在解释表达式时会查找空格。

分享和享受。


编辑

没有注意到你AND之前的问题。将多个表达式与在一起的一种简单方法是将它们一个接一个地放置。要查找 (green|red|blue),后跟一个空格,然后是 (green|red|blue),一个简单的表达式是

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

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

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

可用于。

抵抗是没有用的。

于 2012-08-15T11:01:54.467 回答