2009-04-02 12 views
1

Weiter mit dem Beitrag bei Regular expression to allow a set of characters and disallow othersRegex gibt Fehler

Weiß jemand, warum die unten kommen würde?

Ich erhalte die unten Fehlermeldung, wenn ich einen regulären Ausdruck als erstellen:

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

und geben Sie eine dieser eingeschränkten Zeichen in das Eingabefeld

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) 

aber dieser Ausdruck funktioniert völlig in Ordnung

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

Auch

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

funktioniert, aber

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

funktioniert nicht und gibt den obigen Fehler.

Gibt es eine Begrenzung für die Anzahl der Zeichen, die wie oben verboten werden können?

Grüße, Udit Sud

+0

Klingt wie ein Codierungsproblem für mich, aber Java ist nicht mein Ding – Greg

+0

Wenn es Ihnen besser geht, funktioniert es mit der .NET Regex-Engine. Ich vermute, dass es sich um einen Fehler in dieser bestimmten Java Regex-Implementierung handelt. –

+0

@Udit - Was passiert, wenn Sie das "E" weglassen? –

Antwort

0

Sieht aus wie ein Fehler in Apache regexp Parser. Kannst du einen Standard verwenden (java.util.regex)?

+0

Nur Autor der Frage kann diesen Beitrag als "richtig asnwer" markieren? Schade, er hat das nicht getan .. :( – Vanger

3

Der Bindestrich (Minuszeichen) hat eine besondere Bedeutung in Charakterklassen. Es definiert Bereiche aufeinanderfolgender Zeichen wie "a-z".

Es kann einen konsekutiven Bereich für "*–’" geben, aber ich denke, das ist nicht Ihre Absicht. Wahrscheinlich wollten Sie den wörtlichen Strich, und ich vermute, dass die Ausnahme, die Sie sehen, etwas damit zu tun hat.

Statt dessen:

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

Versuchen:

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

oder

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

oder

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

+1. Jetzt frage ich mich, wenn es keinen Fehler mit der .Net-Engine gibt, verhält es sich wie erwartet ?! –

+0

Ich denke, dass "* -" "Tatsächlich * ist * ein gültiger Bereich, aber etwas daran macht den RECompiler barf. Vielleicht liege ich falsch, aber der Strich ist ziemlich verdächtig. – Tomalak

+0

Meine Vermutung ist, dass es stolpert und mehr vom gleichen Charakter in einem Charakter einschließt Klasse. Konnte/[aa]/crash es? – strager

2

Siehe http://webui.sourcelabs.com/jakarta-regexp/issues/22804 - eine alte Version dieses Pakets tat begrenzen die maximale Anzahl der zulässigen Bereiche, bis 16. Dies wurde 2003 behoben, aber es ist denkbar, dass sie nur das Limit ein wenig erhöht. (?)

Wie auch immer, ich verwende immer den Java-Regex-Parser für jede neue Arbeit.

+0

+1 für das Aufzeigen des entsprechenden Fehlers. – Tomalak