Quelle est la bonne façon de supprimer les mots profanes d'une chaîne donnée:
1) J'ai une liste de 100 mots à rechercher dans un tableau de chaînes.
2) Quelle est la bonne façon de gérer des mots partiels? Comment la plupart des gens gèrent-ils cela? Par exemple la masse de mot. Ensuite, parfois, un mot partiel est également mauvais - suppose que Foobar est un mot extrêmement profane, je souhaite peut-être interdire à Foobar et à Foobar * et * Foobar. P>
Alors, mettez-vous tous les mots dans une seule expression ou une boucle à travers la liste? P>
Quelle est la bonne façon de la résoudre? J'utilise Groovy / Grails, mais les exemples de langues modernes sont les bienvenus. p>
3 Réponses :
(foobar | foobaz | ...) code> li>
-
puis mettez des gardes de chaque côté du groupement pour des caractères étrangers p>
[^! @ # $% ^ & *] * (foobar | foobaz | foofii) [^! @ # $% ^ & *] * p> p> p> p> p> p> p> p> P> P> P> P> P> P> P> P>
ol>
En outre, vous voudrez probablement utiliser un drapeau insensible à casse pour que cela correspond également aux mots comme Foobaz et Foobar. p>
En ce qui concerne la performance, concaténant cela comme une grande regex est probablement le plus rapide (bien que je ne sois pas un expert). L'algorithme de regex est assez efficace lors de la recherche et de la manipulation des succursales. Fondamentalement, il doit être meilleur que O (mn) code> (où m code> est le nombre de mots et n code> est la taille du texte que vous " Recherche) P>
Ceci est un problème assez difficile à résoudre et vous devez déterminer si des expressions régulières fonctionneront pour vous et la manière dont vous manipulez l'incorporation (lorsque vous ajoutez un mot de dictionnaire à une profanité comme Frackface, sauf avec le vrai mot FR). P >
Les expressions régulières ont généralement une limite à la durée de vie et cela vous empêche généralement d'utiliser une seule regex pour tous vos mots. Exécuter de multiples expressions régulières contre une chaîne est vraiment lente, en fonction de la performance dont vous avez besoin et de la taille de votre liste noire. Nous implémentons initialement CleanSpeak en tant que système d'expression régulier, mais il n'a pas été à l'échelle et nous l'avons réécriture à l'aide d'un mécanisme différent. < / p>
Vous devez également prendre en compte des phrases, de la ponctuation, des espaces, leet-parler et d'autres langues. Toutes ces expressions régulières sont moins attrayantes comme une solution. Voici quelques exemples utilisant le mot Bonjour (supposons que c'est une blanchiment pour cet exercice): p>
Vous devez également gérer les cas de bord où deux ou plusieurs mots dictionnaires (Whitelist) contiennent une profanité lorsque l'autre. Quelques exemples contenant le mot S: p>
Celles-ci ne sont évidemment pas favorables à la profanation, mais la plupart des solutions commerciales et de nombreuses solutions commerciales ont des problèmes de ces cas. p>
Nous avons passé les 3 dernières années à perfectionner le filtre utilisé par CleanSpeak pour s'assurer qu'il gère tous ces cas et nous Continuez à le modifier et de le rendre meilleur. Nous avons également passé 8 mois à perfectionner notre système de performance et il peut gérer environ 5 000 messages par seconde. Pour ne pas dire que vous ne pouvez pas construire quelque chose d'utilisable, mais soyez prêt à traiter de nombreux problèmes pouvant proposer et à créer un système qui n'utilise pas d'expressions régulières. P>
Je travaillais sur cette regex plus tôt et cela devrait correspondre aux espaces, et d'autres caractères entre les deux: valide: p> FOO P> foo p> f oo p> foobar p> p>
Vérifiez ce lien: Stackoverflow.com/questions/273516/...
Recherchez le problème Scunthorpe: en.wikipedia.org/wiki/scunthorpe_problem