sql >> Databasteknik >  >> RDS >> Mysql

Mysql Regular Expression-sökning utan upprepade tecken

Eftersom MySQL inte stöder infångningsgrupper för bakåtreferenser, är den typiska lösningen för (\w).*\1 kommer inte att fungera. Detta innebär att varje lösning som ges kommer att behöva räkna upp alla möjliga dubblar. Dessutom, så vitt jag kan säga, är bakåtreferenser inte giltiga i look-aheads eller look-behinds, och look-aheads och look-behinds stöds inte i MySQL.

Du kan dock dela upp detta i två uttryck och använda följande fråga:

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'

Inte särskilt snyggt, men det fungerar och det borde vara ganska effektivt också.

För att stödja en uppsättning gräns för upprepade tecken, använd följande mönster för ditt sekundära uttryck:

A(.*?A){X,}

Där A är din karaktär och X är antalet gånger det är tillåtet.

Så om du lägger till en annan N till din sträng SEPIANN (för totalt 2 N s), din fråga skulle bli:

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


  1. Beräkna tidsskillnaden mellan två rader

  2. Ostrukturerat innehåll:en outnyttjad bränslekälla för AI och maskininlärning

  3. Kan vi begränsa antalet rader i en tabell i MySQL?

  4. Dela upp varchar i separata kolumner i Oracle