正则表达式:字符串中重复相同的元音 - Oracle SQL

Posted

技术标签:

【中文标题】正则表达式:字符串中重复相同的元音 - Oracle SQL【英文标题】:RegEx: Repeated identical vowels in a string - Oracle SQL 【发布时间】:2015-04-05 03:39:55 【问题描述】:

我只需要在 Oracle11g 中显示那些包含 2 个或更多相同元音的字符串(制造商名称)。我正在使用正则表达式来查找它。

SELECT manuf_name "Manufacturer", REGEXP_LIKE(manuf_name,'([aeiou])\2') Counter FROM manufacturer;

例如: RegEx 接受

OtterBox
Abca
abcA

RegEx 拒绝

Samsung
Apple

我不确定如何继续。

【问题讨论】:

我对 Oracle11g 不熟悉,但是如果有人帮助你,他们会想知道如果你的字符串同时包含 OtterBoxSamsung 会发生什么|| Apple。拒绝还是接受? 我没有看到您发布的输出(和被拒绝的字符串)有问题。当您说“2 个或更多相同的元音”时,您是否反对 Otterbox 中的 Oo 不是相同的情况,因此在技术上是“相同的”?祝你好运。 @Jonathan - Otterbox 被接受,因为元音 'o' 出现两次。检查需要不区分大小写。我已经更新了问题以提供更清晰的信息。 【参考方案1】:

我想你想要这样的东西:

WITH mydata AS (
  SELECT 'OtterBox' AS manuf_name FROM dual
   UNION ALL
  SELECT 'Apple' FROM dual
   UNION ALL
  SELECT 'Samsung' FROM dual
)
SELECT * FROM mydata
 WHERE REGEXP_LIKE(manuf_name, '([aeiou]).*\1', 'i');

我不确定您为什么使用 \2 作为反向引用而不是 \1 -- \2 没有引用此正则表达式中的任何内容。另外,请注意通配符和量词.* 表示在元音的第一次出现和第二次出现之间可以有任意数量的任意字符。第三,注意'i' 参数表示不区分大小写的搜索(我认为这是你想要的,因为你说正则表达式应该匹配“OtterBox”)。

SQL Fiddle here.

【讨论】:

我看到你的小提琴确实可以工作,但是那个正则表达式在正则表达式测试器中对我不起作用。谁能解释一下? 可能是 POSIX ERE 正则表达式(由 Oracle 使用)和您在测试器中使用的任何正则表达式引擎之间的区别。 我现在明白了,看过你的正则表达式。您希望正则表达式捕获整个制造商名称。这里不需要,我只关心它是否匹配。 啊,现在说得通了。【参考方案2】:

David 你的对我来说不太好用。这个呢?

\w*([aeiou])\w*\1+\w*

https://regex101.com/r/eE3iC2/3

编辑:根据建议更新一个:

.*([aeiou]).*\1.*

https://regex101.com/r/eE3iC2/5

【讨论】:

好吧,如果他们混合大小写,这将不起作用(因此它将匹配 otterbox,但不匹配 Otterbox)。我试图弄清楚。编辑:现在修复。 上述内容不适用于Otter Box 之类的内容,因为您没有考虑非单词字符。 regex101.com/r/eE3iC2/4 两件事,你不需要后向引用后的量词(你在捕获组中匹配了一次字符,你只需要再匹配一次,你会想要一个通配符而不是单词字符类。 谢谢,现在应该修好了。

以上是关于正则表达式:字符串中重复相同的元音 - Oracle SQL的主要内容,如果未能解决你的问题,请参考以下文章

JAVA正则表达式判断元音

正则表达式

使用正则表达式匹配字符串的相同开始和结束字符

Javascript 正则表达式替换必须保留德语变异元音

如何使用正则表达式搜索忽略 NSPredicate 的某些字符?

不以元音开头或结尾的单词的正则表达式?