我正在努力提高varchar中包含的元音的数量, 我一直在谷歌四处寻找,但没有成功。
任何人都可以帮我一把吗?
答案 0 :(得分:3)
像
这样的东西select length(regexp_replace('andrew','[^AEIOUaeiou]')) as vowels from dual;
答案 1 :(得分:2)
如果您使用的是Oracle 11g,则可以使用REXEXP_COUNT函数来确定与模式匹配的内容。
SQL> select regexp_count('andrew', '[aeiou]', 1, 'i') as vowels
2 from dual;
VOWELS
----------
2
第一个参数是您要匹配的字符串'andrew'
。
第二个参数是匹配模式,在本例中为[aeiou]
。 []
表示字符列表;解析器以任何顺序匹配此列表中的任何和所有字符。
第三个参数1
是开始位置,表示Oracle应该开始搜索匹配项的字符串的位置索引。它仅包含在内,因此我可以使用第四个参数。
第四个参数是匹配参数,'i'
表示我想进行不区分大小写的匹配。这就是字符列表不 [aeiouAEIOU]
的原因。
如果您使用的是10g,那么REGEXP_COUNT就不存在了。在这种情况下,您可以使用Annjawan's solution更精确的REGEXP_REPLACE版本。
SQL> select length(regexp_replace('andrew','[^aeiou]', '', 1, 0, 'i')) as vowels
2 from dual;
VOWELS
----------
2
克拉(^
)表示不是,即用空字符串替换字符串'andrew'
中不在字符列表[aeiou]
中的每个字符。下一个参数再次是起始位置。第五个参数0
表示您要替换匹配模式的每个次出现,并再次使用匹配参数'i'
来表示不区分大小写的匹配。
Gaurav's answer不正确。这是因为在角色列表中他包含了逗号。请记住,如果可用的话,字符列表中的所有都会匹配。所以,如果我在你的字符串中引入一个逗号,你的字符串中就会有3个“元音”:
SQL> select regexp_count('an,drew','[a,e,i,o,u,A,E,I,O,U]' ) as vowels
2 from dual;
VOWELS
----------
3
正则表达式不是简单的动物,我强烈建议您在尝试时阅读the documentation。
答案 2 :(得分:1)
SELECT length('andrew')
- length(REGEXP_REPLACE('andrew','[a,e,i,o,u,A,E,I,O,U]',''))
FROM DUAL;
输出:2 - a
和e
这里有两个元音。
如果您使用的是Oracle 11g,那么
SELECT REGEXP_COUNT('andrew','[a,e,i,o,u,A,E,I,O,U]' ) from dual