Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Wyszukiwanie wyrażeń regularnych Mysql bez powtarzających się znaków

Ponieważ MySQL nie obsługuje grup przechwytywania odwołań wstecznych, typowe rozwiązanie (\w).*\1 nie będzie działać. Oznacza to, że każde podane rozwiązanie będzie musiało wyliczyć wszystkie możliwe dublety. Ponadto, o ile wiem, odniesienia wsteczne nie są prawidłowe w przypadku patrzenia w przód lub w tył, a spojrzenia w przód i w tył nie są obsługiwane w MySQL.

Możesz jednak podzielić to na dwa wyrażenia i użyć następującego zapytania:

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'

Niezbyt ładna, ale działa i powinna być również dość wydajna.

Aby obsłużyć ustalony limit powtarzających się znaków, użyj następującego wzorca wyrażenia drugorzędnego:

A(.*?A){X,}

Gdzie A to twoja postać i X to ile razy jest to dozwolone.

Więc jeśli dodajesz kolejne N do twojego ciągu SEPIANN (łącznie 2 N s), Twoje zapytanie będzie wyglądało następująco:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Odmowa dostępu przy tworzeniu początkowej bazy danych – jak przyznać właściwy dostęp?

  2. Kod błędu:1052. Kolumna „ATRYBUT” na liście pól jest niejednoznaczna

  3. Czy potrafisz zdefiniować tabele dosłowne w SQL?

  4. Wyeliminuj podzapytanie dla średniej wartości liczbowej

  5. Zadeklaruj zmienną w bazie danych MySQL „tylko do odczytu”