regexp_like 选择属性字符串包含多个不同单词的行
Posted
技术标签:
【中文标题】regexp_like 选择属性字符串包含多个不同单词的行【英文标题】:regexp_like to selects rows where an attribute string contains several different words 【发布时间】:2012-08-15 10:52:22 【问题描述】:对 regexp 有点陌生,并寻求一些帮助来理解一些功能。我目前正在尝试选择一些数据集,这些数据以一个单词开头,后跟一个空格,然后是几个可能的单词。
示例 1: 我基本上是在寻找诸如 Product1 green、Product1 red、Product1 blue(基本上是绿色、红色或蓝色)之类的数据,但不是: 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]');
假设,有人知道我也可以实现“与”的方法,例如选择在同一属性中包含单词 green 和 red 的项目。
示例 2: 类似情况,但试图匹配标点符号后的单词
Where regexp_like (job, 'Commerce [[:punct:]] .*');
通过此查询,我希望选择具有 商业 - 测试 商业:abcdefg
这些查询没有像我期望的那样工作,我无法完全弄清楚原因。我假设我误解了这些正则表达式的构造。
任何帮助/解释将不胜感激!
【问题讨论】:
【参考方案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)')
取决于您在 Product1
之后的期望 - 第一种情况允许零个或多个任何类型的字符,第二种情况要求在 Product1
之后有一个空格,第三种情况需要在 @ 之后有一个或多个空格987654326@.
不确定第二个的确切位置。如果您真的想要以 'Commerce' 开头的字符串,后跟一个空格,后跟一个标点符号,另一个空格,然后是任何内容,请尝试
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
的问题。将多个表达式与在一起的一种简单方法是将它们一个接一个地放置。要查找 (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)')
可以使用。
抵抗是没有用的。
【讨论】:
感谢您的帮助!这不会允许像“Product1xasdasdgreen”这样的组合(因为任何字符符号)?你能解释一下这将如何考虑不同的“单词”(例如:产品 1以上是关于regexp_like 选择属性字符串包含多个不同单词的行的主要内容,如果未能解决你的问题,请参考以下文章
REGEXP_LIKE 匹配与特定字符串不同的 xml 标记内容