2012-08-15 121 views
3

对regexp有点新意,并寻求一些帮助理解某些功能。我目前正在尝试选择一些数据集,这些数据集以一个单词开头,后跟一个空格,然后是几个可能的单词。regexp_like用于选择属性字符串中包含多个不同单词的行

例1: 我基本上希望选择这样的产品1绿色产品1红,产品1蓝(绿,红或蓝基本),但没有数据: XYZ产品1,产品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”,例如选择其中包含单词绿色项目和红色在相同的属性。

例2: 类似的情况,但在尝试了标点符号

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

与此查询我期待选择具有 商务部的工作后,一个字匹配 - 测试 商务部:ABCDEFG

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

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

回答

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后有一个或多个空格。

不确定你要去哪里准确的第二个。如果你真的想以“商务”,后面加一个空格,后面一个标点符号,一个空格,然后什么开头的字符串,尝试

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

如果不是一个标点符号你正在寻找任“:”或“ - ”,尝试

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

我对正则表达式没有很大的专家,但我会尽力提供一些解释:

  • ^要求下面的元素在字符串的开头。因此,在第一种情况下,^Product1表示“'Product1'必须位于字符串的开头”。
  • 在正则表达式中,括号用于表达式组合,所以在第一种情况下,(green|red|blue)被组合在一起。
  • |是逻辑OR,所以(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)') 

可以使用。

抵抗是无用的。

+0

感谢您的帮助!不会允许像'Product1xasdasdgreen'这样的组合(因为任何字符符号)?你能否解释一下这将如何考虑“单词”是不同的(例如:产品1 绿色/红色/蓝色)。谢谢! – user1523257 2012-08-15 11:14:40

+0

显然,我在添加第二个示例的同时编写了您的评论 - 请看看它。我不明白你的意思是......“这个词”是不同的“。请编辑您的帖子并添加其他应该或不应该匹配的示例。谢谢。 – 2012-08-15 12:07:04

+0

@ user1523257 - 之前没有注意到关于AND逻辑的查询,所以在我的答案结尾添加了这个。 – 2012-08-15 16:05:04

相关问题