Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Mysql-Suche mit regulären Ausdrücken ohne sich wiederholende Zeichen

Da MySQL keine zurückverweisenden Erfassungsgruppen unterstützt, ist die typische Lösung (\w).*\1 wird nicht funktionieren. Das bedeutet, dass jede gegebene Lösung alle möglichen Doubles aufzählen muss. Außerdem sind, soweit ich das beurteilen kann, Rückverweise in Look-Aheads oder Look-Behinds nicht gültig, und Look-Aheads und Look-Behinds werden in MySQL nicht unterstützt.

Sie können dies jedoch in zwei Ausdrücke aufteilen und die folgende Abfrage verwenden:

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'

Nicht sehr hübsch, aber es funktioniert und es sollte auch ziemlich effizient sein.

Um eine festgelegte Begrenzung wiederholter Zeichen zu unterstützen, verwenden Sie das folgende Muster für Ihren sekundären Ausdruck:

A(.*?A){X,}

Wobei A ist dein Charakter und X ist die zulässige Anzahl.

Wenn Sie also ein weiteres N hinzufügen zu Ihrer Zeichenfolge SEPIANN (für insgesamt 2 N s), würde Ihre Abfrage folgendermaßen aussehen:

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}'