/ / Ruby Espressione regolare troppo grande / Corrispondenza di stringhe multiple - ruby, regex

Ruby Espressione regolare troppo grande / Corrispondenza a più stringhe - rubino, regex

Ho 1.000.000 di stringhe che voglioclassificare. Il modo in cui lo faccio è riempirlo se contiene una serie di parole o frasi. L'insieme delle parole è di circa 10.000. Idealmente, sarei in grado di supportare le espressioni regolari, ma mi concentro sul farlo correre veloce in questo momento. Frasi di esempio:

ford, porsche, mazda ...

Non voglio davvero abbinare ogni parola con le stringhe una per una, quindi ho deciso di usare espressioni regolari. Sfortunatamente, sto riscontrando un problema di espressione regolare:

Regexp.new ( "(a)" * 253) => / (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a ) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) ( a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) ...

Regexp.new ( "(a)" * 254) RegexpError: espressione regolare troppo grande: / (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a ) (a) (a) (a) (a) (a) (a) (a) (a) (a) (a) ...

dove a sarebbe una delle mie parole o frasi. In questo momento, sto programmando di eseguire 10.000 / 253 partite. Ho letto che la lunghezza della regex influisce pesantemente sulle prestazioni, ma la mia corrispondenza regex è davvero semplice e la regexp viene creata molto rapidamente. Vorrei in qualche modo aggirare la limitazione o utilizzare una soluzione migliore se qualcuno ha qualche idea. Grazie.

risposte:

1 per risposta № 1

Potresti considerare altri meccanismi per riconoscere 10k parole.

  • Trie: a volte chiamato albero dei prefissi, viene spesso utilizzato dai correttori ortografici per eseguire ricerche di parole. Vedere Trie su wikipedia
  • DFA (automi finiti deterministici): Un DFA viene spesso creato dal lexer in un compilatore per riconoscere i token della lingua. Un DFA viene eseguito molto rapidamente. Le regex semplici sono spesso compilate in DFA. Vedere DFA su Wikipedia