如果使用的是Oracle 11g,则可以使用REXEXP_COUNT函数确定与模式匹配的内容。
sql> select regexp_count('andrew', '[aeIoU]', 1, 'i') as vowels
2 from dual;
VOWELS
----------
2
第一个参数是您要匹配的字符串'andrew'
。
第二个参数是匹配模式,在这种情况下为[aeIoU]
。在[]
表示一个字符列表; 解析器以任何顺序匹配此列表中的所有字符。
第三个参数,1
是开始位置,指示Oracle应该在其中开始搜索匹配项的字符串的位置索引。它仅包含在内,因此我可以使用第四个参数。
第四个参数是match参数,'i'
指示我要执行不区分大小写的匹配。这就是为什么字符列表 不 存在的原因[aeIoUAEIoU]
。
如果您使用的是10克,则REGEXP_COUNT不存在。在这种情况下,你可以使用更确切版本Annjawan的解决方案与REGEXP_REPLACE。
sql> select length(regexp_replace('andrew','[^aeIoU]', '', 1, 0, 'i')) as vowels
2 from dual;
VOWELS
----------
2
克拉(^
)表示不是,即用空字符串替换字符串'andrew'
列表中不在字符串中的每个字符[aeIoU]
。下一个参数再次是起始位置。第五个参数0
表示您要替换每次 匹配的模式,并且我再次使用match参数'i'
表示不区分大小写的匹配。
Gaurav的答案不正确。这是因为在字符列表中,他包括了逗号。请记住,如果可用,字符列表中的所有内容都 将匹配。因此,如果我在您的字符串中引入逗号,则您的字符串中将有3个“元音”:
sql> select regexp_count('an,drew','[a,e,i,o,u,A,E,I,O,U]' ) as vowels
2 from dual;
VOWELS
----------
3
正则表达式不是简单的野兽,我会强烈建议你阅读的文档尝试他们的时候。