2008-12-12 10 views
2

J'ai un problème très étrange. J'ai une très grande expression régulière à la recherche de certains mots dans certains textes (RegEx ressemble à ceci: (?i)\b(a|b|c|d...)\b; et ainsi de suite où a, b, c, d, représentent des mots). Quoi qu'il en soit, je l'ai mis dans un assemblage pré-compilé pour accélérer les choses, mais le problème est que la regex pré-compilée ne fonctionne pas comme une version non compilée de la même regex ... o_0Pré compiler une très grande expression régulière

Par exemple si la regex est: (?i)\b(he|desk)\b et que je passe "helpdesk" à travers elle la version pré compilée retourne "lp" donc les mots lui et le bureau sont rayés comme si la condition aux limites ne fonctionne pas du tout, mais si je les utilise exactement expression régulière une version non pré compilée cela fonctionne très bien ... Est-ce que quelqu'un sait si je peux manquer quelque chose?

Merci

(Désolé utilisant VB.Net et C#)

+0

Quelle langue utilisez-vous? – mat

+0

Étiquette avec implémentation regex réelle s'il vous plaît. –

+0

Comment exactement précompilez-vous l'expression régulière? Quels paramètres passez-vous à Regex.CompileToAssembly? –

Répondre

0

que vous avez donné il y a deux langues différentes. Alors peut-être qu'il y a une interaction.

Dans tous les cas, je pense que certains programmes de test courts mais complets peuvent être en ordre - essayez de reproduire le problème dans un code de test indépendant pour le rendre plus facile à raisonner.

Peut-être qu'il serait plus efficace de faire la recherche sans expressions régulières?

0

J'ai écrit deux applications de test, l'une en C# et l'autre en VB.Net présentent toutes les deux le même comportement. Il semble que la version pré-compilée de l'expression régulière que j'utilise ignore les conditions aux limites de certains mots. J'ai essayé de ne pas utiliser regex mais j'ai une liste de plus de 3000 mots dans l'expression et après quelques tests cela semble être la meilleure solution, la seule chose est que je ne le veux pas dans mon code principal et je préférerais l'avoir un ensemble pré compilé ...

Merci

+0

Les expressions régulières ne sont * pas * une fonctionnalité de C# ou VB.NET. Ils font partie du framework .NET et en tant que tels, C# et VB.NET partagent la même implémentation. –

+0

Je comprends cela, bien que j'ai trouvé que certains caractères sont interprétés différemment, probablement en raison de l'encodage. Donc, pour être sûr que j'ai essayé les deux ... Toute idée si je peux utiliser la fonctionnalité regex en C++? – Serge

+0

Si vous préfixez la chaîne avec @ en C#, les caractères seront codés de la même manière que VB.Net. Vous devriez donc utiliser Regex (@ "(? I) \ b (he | desk) \ b") au lieu de Regex ("(? I) \ b (he | desk) \ b") car le \ b sera encodé comme un retour arrière dans le second exemple. –

1

Puisque vous êtes à la recherche des mots entiers, comment sur la recherche de \w+, et vérifier si le mot est dans une collection. Un ensemble basé sur le hachage ou une table de hachage fonctionnerait bien ici. Cette approche faciliterait la mise à jour de la liste si le besoin s'en faisait sentir.

+0

En fait, je n'ai pas pensé à utiliser '\ w +' mais le seul problème est que je souffre déjà de bogues MOO et que je voudrais vraiment éviter de garder en mémoire quelque chose d'aussi gros que ça ... – Serge