我正在尝试增加 varchar 中包含的元音的数量,我一直在谷歌中四处寻找,但没有成功。
任何人都可以帮我解决这个问题吗?
就像是
select length(regexp_replace('andrew','[^AEIOUaeiou]')) as vowels from dual;
如果您使用的是 Oracle 11g,则可以使用REEXXP_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 不存在。在这种情况下,您可以使用带有REGEXP_REPLACE的 Annjawan 解决方案的更精确版本。
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
正则表达式不是简单的野兽,我强烈建议在尝试它们时阅读文档。
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