Ho il problema che voglio far corrispondere tutte le stringhe nel database con una certa distanza di modifica a una determinata stringa.Genera un'espressione regolare per una determinata stringa e modifica la distanza
La mia idea era di generare un'espressione regolare che corrispondesse a tutte le stringhe con la distanza di modifica d
nella stringa s
.
Così, per esempio voglio generare una regex r
per d = 1
e s = 'abc'
sotto forma di: r = 'abc|.abc|.bc|a.c|ab.|abc.'
e così via. Ma non sono sicuro se questo è molto efficiente o ci sono già alcuni buoni algoritmi per questo problema? Voglio considerare anche gli scambi di caratteri nella distanza di modifica. quindi r
dovrebbe anche essere 'acb'
. Voglio realizzarlo in PHP e quindi creare una query SQL: SELECT * FROM table WHERE name RLIKE TheRegularExpression
.
È un buon modo per farlo in quel modo? O cosa consiglieresti?
Se si vuole l'efficienza, prima di tutto si dovrebbe evitare di applicare una condizione in cui che non può essere risolto utilizzando un indice per tutti i record in una tabella, a meno che il tavolo è abbastanza piccolo. – millimoose
Inoltre, considera che la lunghezza del pattern risultante sarà 'O (nCd)', dove 'n' è la lunghezza della stringa, e' d' è la tua distanza. Questo può potenzialmente portare a modelli molto grandi. Ad esempio, per una stringa di caratteri '80', con una distanza desiderata di '5', si invierà un RE di circa due gigabyte al database. (Questo è solo considerando le sostituzioni di caratteri, non le trasposizioni.) Tuttavia, se sei sicuro che le stringhe saranno corte e/o 'd' sia molto piccolo o molto vicino a' n', potrebbe essere fattibile. – millimoose
Un'altra implicazione è che se le stringhe vengono immesse dagli utenti, è necessario assicurarsi che la lunghezza sia entro un certo limite, altrimenti si creerebbe un buco DoS. (Come con qualsiasi algoritmo molto, molto inefficiente con parametri inseriti dall'utente.) – millimoose