2013-09-30 3 views
0

Мне нужно регулярное выражение для двух одинаковых гласных в varchar.SQL: 2 одинаковых гласных регулярное выражение

Как 'linEbrEak' (но только 2 не больше и не меньше)

Я думал, что-то вроде:

'%[aeiouAEIOU]%[aeiouAEIOU]%' 

Но это дает мне любые 2 гласные. Я хочу двух одинаковых.

Я использую SQL Server 2008.

Это возможно даже в Regex? Огромное спасибо!

Другие примеры:

LeIpzIg 
LOndOn 

Edit: Это нормально, если это не представляется возможным (слишком сложно, может быть) в регулярных выражениях, я счастлив с другими решениями тоже, но они должны быть легко читать, быстро и короткие ,

+1

для меня выглядит, как вы хотите, не Regex, но использовать это с LIKE :) – Darka

+0

Есть ли у нее быть единственным регулярным выражением? Было бы намного чище с заменой, за которой следует регулярное выражение. Если да, то что такое реальное использование? Звучит как требование bizzare. –

+0

Нет, это не реальное использование, а упражнение для SQL-присваивания ... Это нормально, если не делать это с регулярным выражением, но оно должно быть чистым и быстрым. – moritzg

ответ

4

Это не очень или короткий, но это просто.

SELECT word 
FROM tabl 
WHERE 
    -- assuming case sensitive based on your example 
    (word LIKE '%[Aa]%[Aa]%' AND word NOT LIKE '%[Aa]%[Aa]%[Aa]%') 
    OR 
    (word LIKE '%[Ee]%[Ee]%' AND word NOT LIKE '%[Ee]%[Ee]%[Ee]%') 
    OR 
    (word LIKE '%[Ii]%[Ii]%' AND word NOT LIKE '%[Ii]%[Ii]%[Ii]%') 
    OR 
    (word LIKE '%[Oo]%[Oo]%' AND word NOT LIKE '%[Oo]%[Oo]%[Oo]%') 
    OR 
    (word LIKE '%[Uu]%[Uu]%' AND word NOT LIKE '%[Uu]%[Uu]%[Uu]%') 

Это происходит со мной, что вы не указали, что делать место, которое имеет два одной гласную и три другие. Это подходит? Если нет (Say Alaska StatE PEak Park было плохо, даже если она имеет ровно 2 E в нем), то вы можете это вместо:

SELECT word 
FROM tabl 
WHERE 
    -- assuming case sensitive based on your example 
    (word LIKE '%[Aa]%[Aa]%' 
    OR word LIKE '%[Ee]%[Ee]%' 
    OR word LIKE '%[Ii]%[Ii]%' 
    OR word LIKE '%[Oo]%[Oo]%' 
    OR word LIKE '%[Uu]%[Uu]%' 
) 
    AND word NOT LIKE '%[Aa]%[Aa]%[Aa]%' 
    AND word NOT LIKE '%[Ee]%[Ee]%[Ee]%' 
    AND word NOT LIKE '%[Ii]%[Ii]%[Ii]%' 
    AND word NOT LIKE '%[Oo]%[Oo]%[Oo]%' 
    AND word NOT LIKE '%[Uu]%[Uu]%[Uu]%' 
+1

Кроме того, чтобы второе решение было немного более однородным, серия NOT LIKE может быть переписана как '... AND NOT (слово LIKE '% [Aa]% [Aa]% [Aa]%' ИЛИ ​​слово LIKE. ..) '. Тем не менее, он ничего не выиграет. –

+0

Спасибо, это может быть не то, что я искал (regex), но он работает! – moritzg

+0

Да, я знаю только MSSQL, MySQL и PostgreSQL. Из трех только PostgreSQL фактически имеет «обратные ссылки», которые позволили бы сделать это довольно чисто. 'WHERE word ~ ​​'([aeiou]). * \ 1' AND NOT word ~ ​​'([aeiou]). * \ 1. * \ 1'' может работать. – Mark

0

Одно из возможных решений

DECLARE @txt VARCHAR(100) = 'LeIpzIg' 

DECLARE @vowels TABLE (letter CHAR(1)) 
INSERT INTO @vowels VALUES ('a'),('e'),('i'),('o'),('u') 

;WITH cte AS (
    SELECT letter , LEN(@txt) - LEN(REPLACE(LOWER(@txt),letter,'')) as number_of_vowel 
    FROM @vowels 
    WHERE LOWER(@txt) LIKE '%'+ letter +'%' 
) 
SELECT letter 
FROM cte 
WHERE number_of_vowel >= 2 
Смежные вопросы