2009-04-02 5 views
1

continue avec le poste à Regular expression to allow a set of characters and disallow othersRegex donne erreur

Quelqu'un sait-il pourquoi l'aurait-dessous lieu?

Je reçois l'erreur ci-dessous lorsque je crée une expression régulière:

[^@*–’”“\r\nœçsÇSgGšcrŠRNEŽDTCnežuUIti—¿„”]+ 

et entrer dans l'un de ces caractères restreints dans le champ de saisie

java.lang.ArrayIndexOutOfBoundsException 
    at org.apache.regexp.RECompiler$RERange.delete(RECompiler.java:1326) 
    at org.apache.regexp.RECompiler$RERange.remove(RECompiler.java:1417) 
    at org.apache.regexp.RECompiler$RERange.include(RECompiler.java:1459) 
    at org.apache.regexp.RECompiler$RERange.include(RECompiler.java:1470) 
    at org.apache.regexp.RECompiler.characterClass(RECompiler.java:699) 
    at org.apache.regexp.RECompiler.terminal(RECompiler.java:863) 
    at org.apache.regexp.RECompiler.closure(RECompiler.java:942) 
    at org.apache.regexp.RECompiler.branch(RECompiler.java:1151) 
    at org.apache.regexp.RECompiler.expr(RECompiler.java:1203) 
    at org.apache.regexp.RECompiler.compile(RECompiler.java:1281) 
    at org.apache.regexp.RE.(RE.java:495) 
    at org.apache.regexp.RE.(RE.java:480) 

mais cette expression fonctionne parfaitement bien

[^@*–’”“\r\nœçsÇSgGšcrŠRN]+ 

En outre,

[^@*–’”“\r\nœçsÇSgGšcrŠR„”]+ 

œuvres mais

[^@*–’”“\r\nœçsÇSgGšcrŠRNE]+ 

ne fonctionne pas et donne l'erreur ci-dessus.

Y at-il une limite au nombre de caractères qui peuvent être interdits comme ci-dessus?

Cordialement, Udit Sud

+0

Cela me semble être un problème d'encodage, mais Java n'est pas mon truc – Greg

+0

Si cela vous fait vous sentir mieux, cela fonctionne avec le moteur .NET Regex. Je suppose que c'est un bug dans cette implémentation de Java Regex. –

+0

@Udit - que se passe-t-il lorsque vous omettez le "E"? –

Répondre

0

ressemble à une erreur dans l'analyseur apache regexp. Pouvez-vous utiliser un standart un (java.util.regex)?

+0

Seul l'auteur de la question peut marquer cet article comme "right asnwer"? Dommage qu'il ne l'ait pas fait .. :( – Vanger

3

Le tableau de bord (signe moins) a une signification particulière dans classes de caractères. Il définit des plages de caractères consécutifs, tels que "a-z".

Il peut exister une plage consécutive pour "*–’", mais je suppose que ce n'est pas votre intention. Vous avez probablement voulu le tiret littéral, et je soupçonne que l'exception que vous voyez a quelque chose à voir avec cela.

Au lieu de cela:

[^@*–’”“\r\nœçsÇSgGšcrŠRNEŽDTCnežuUIti—¿„”]+ 
----^ (this is the error) 

Essayez:

[^@*’”“\r\nœçsÇSgGšcrŠRNEŽDTCnežuUIti—¿„”–]+ 
-----------------------------------------^ (this okay) 

ou

[-^@*’”“\r\nœçsÇSgGšcrŠRNEŽDTCnežuUIti—¿„”]+ 
-^ (this okay as well) 

ou

[^@*\–’”“\r\nœçsÇSgGšcrŠRNEŽDTCnežuUIti—¿„”]+ 
----^^ (this okay as well) 
+0

+1 Maintenant je me demande, s'il ne donne pas d'erreur avec le moteur .Net, est-ce qu'il se comporte comme prévu ?! –

+0

Je suppose que "* - ' "en fait, * est * une plage valide, mais quelque chose à propos de ça fait la barre de RECompiler." Peut-être que je me trompe, mais le tableau de bord est assez suspect – Tomalak

+0

Je pense qu'il se déclenche en incluant plus du même personnage dans un personnage – strager

2

Voir http://webui.sourcelabs.com/jakarta-regexp/issues/22804 - une ancienne version de ce paquet a fait limiter le nombre maximum de plages autorisées, à 16. Cela a été corrigé en 2003, mais il est concevable qu'ils ont juste augmenté la limite un peu. (?)

Quoi qu'il en soit, j'utilise toujours l'analyseur Regex intégré Java pour tout nouveau travail, comme d'autres l'ont suggéré.

+0

+1 pour avoir signalé le bogue approprié. – Tomalak

Questions connexes