Mysql
 sql >> Database >  >> RDS >> Mysql

Ricerca Mysql Regular Expression senza caratteri ripetuti

Dal momento che MySQL non supporta i gruppi di acquisizione dei riferimenti a ritroso, la soluzione tipica di (\w).*\1 non funzionerà. Ciò significa che qualsiasi soluzione data dovrà enumerare tutti i possibili doppi. Inoltre, per quanto ne so, i back-reference non sono validi in look-ahead o look-behind, e i look-ahead e look-behind non sono supportati in MySQL.

Tuttavia, puoi dividerlo in due espressioni e utilizzare la seguente query:

SELECT * FROM words
WHERE word REGEXP '^[SEPIAN]{1,6}$'
AND NOT word REGEXP 'S.*?S|E.*?E|P.*?P|I.*?I|A.*?A|N.*?N'

Non molto carino, ma funziona e dovrebbe essere anche abbastanza efficiente.

Per supportare un limite impostato di caratteri ripetuti, utilizza il seguente modello per l'espressione secondaria:

A(.*?A){X,}

Dove A è il tuo carattere e X è il numero di volte che è consentito.

Quindi, se stai aggiungendo un altro N alla tua stringa SEPIANN (per un totale di 2 N s), la tua richiesta diventerebbe:

SELECT * FROM words
WHERE word REGEXP '^[SEPIAN]{1,7}$'
AND NOT word REGEXP 'S.*?S|E.*?E|P.*?P|I.*?I|A.*?A|N(.*?N){2}'