2010-11-24 4 views
0

En démarrant une nouvelle question, mon autre question a résolu un problème différent avec la regex.Problème Regex utilisant ICU regex/regexkitlite

Voici mon regex:

(?i)\\d{1,4}(?<!v(?:ol)?\\.?\\s?)(?![^\\(]*\\))

Regex divisé pour plus de clarté:

(?i) - insensible à la casse

\\d{1,4} - un numéro à 1-4 chiffres

(?<!v(?:ol)?\\.?\\s?) la nombre ne peut pas être précédé de 'v', 'v.', 'vol', 'vol.', avec o r sans espace à la fin.

(?![^\\(]*\\)) - Le nombre ne peut pas être entre parenthèses.

Tout fonctionne à l'exception du 'vol.' bit:

@"Words words 342 words (2342) (words 2 words) (words).ext" résultat 342 - correct.

@"Words - words words (2010) (words 2 words) (words).ext" résultat nul - correct.

@"words words v34 35.ext" résultat 34 - incorrect.

@"Words vol.342 343 (1234) (3 words) (desc).ext" résultat 342 - incorrect.

Qu'est-ce que je fais de mal avec mon 'vol.' section?

Répondre

2

Vous devez placer le lookbehind avant le numéro. En outre, vous devez ajouter des chiffres en tant que caractères illégaux dans le lookbehind, ou le 4 en v.34 correspondra. Essayez

(?i)(?<!v(?:ol)?\\.?\\s*\\d*)\\d{1,4}(?![^(]*\\)) 

Ce attend (edit: à tort, comme il se avère) que regexkitlite soutient la répétition infinie à l'intérieur qui lookbehind pas beaucoup de saveurs regex font.

Un coup d'oeil dans le docs montre qu'il prend en charge la répétition à l'intérieur lookbehind, et si vous êtes au courant fini (mais variable) que la suivante ne fonctionnera que s'il y a au plus un espace entre vol. et le nombre, alors vous pourriez essayer

(?i)(?<!v(?:ol)?\\.?\\s?)(?<!\\d)\\d{1,4}(?![^(]*\\)) 
+0

Ne fonctionne pas, j'ai peur. De plus, sur la dernière question que j'ai soulevée, quelqu'un a dit que les regards de reconnaissance devraient venir après le numéro. Maintenant, je ne sais pas quoi penser! –

+0

Eh bien, une assertion lookbehind regarde vers l'arrière à partir de la * position actuelle * dans la chaîne, donc si vous le mettez après le nombre, elle regardera le nombre et verra qu'il n'est pas «vol» ou quelque chose comme ça. Cette regex travaille dans RegexBuddy; mais il se peut bien que regexkitlite ne supporte pas la répétition infinie ou même variable dans les assertions lookbehind (si elle les supporte du tout, certains langages comme JavaScript ne connaissent pas lookbehind ...). –

+0

Je viens de jeter un oeil à la [docs] (http://regexkit.sourceforge.net/RegexKitLite/#ICUSyntax_ICURegularExpressionSyntax) et selon ce que je trouve là, la deuxième regex devrait fonctionner. OH! Je réalise juste que j'ai oublié d'échapper aux barres obliques inverses! Éditera. –