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 green/red/blue)。谢谢! 显然我在您撰写评论时添加了第二个示例 - 看看它。我不明白你所说的“......'单词'是不同的”是什么意思。请编辑您的帖子并添加其他示例,说明应该匹配或不应该匹配的内容。谢谢。 @user1523257 - 之前没有注意到您对 AND 逻辑的查询,所以在我的回答末尾添加了这个。

以上是关于regexp_like 选择属性字符串包含多个不同单词的行的主要内容,如果未能解决你的问题,请参考以下文章

REGEXP_LIKE 匹配与特定字符串不同的 xml 标记内容

oracle 字符串匹配查询

oracle regexp_like 与 select 模式

如何匹配包含某个字符串的属性?

如何匹配包含某个字符串的属性?

PL/SQL:字符串的 regexp_like 不以字母开头