2

我正在尝试增加 varchar 中包含的元音的数量,我一直在谷歌中四处寻找,但没有成功。

任何人都可以帮我解决这个问题吗?

4

3 回答 3

3

就像是

select length(regexp_replace('andrew','[^AEIOUaeiou]')) as vowels from dual;
于 2012-12-06T22:36:01.907 回答
2

如果您使用的是 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

正则表达式不是简单的野兽,我强烈建议在尝试它们时阅读文档。

于 2012-12-07T09:19:01.397 回答
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
于 2012-12-06T22:25:33.493 回答