2016-05-23 10 views
1

Ich habe folgende regexpRegex verursacht Stackoverflow

(([^'])|(''))* 

, die die Literale gut genug, um in der Regel

aber mit dem folgenden Text zu analysieren (Sie können es versuchen):

xxxxxxx_xxx_xxxxxxx=xxxxxx.xxxxxxxxxxx.xxxxxxx.xxxxxxxxxx`2[xxxxxx.xxxxxx,xxxxxx.xxxxxx]xxxxxxx_xxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xxxxxxxxxxxxxxxxx=1455544499467&xxxxxxxxx_xxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xx=xxxxxxx &xxxxxxx_xxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xxxxxxxxx=xxxxxxx_701454xx-x23x-4x31-xx75-xxx185x3xx26&xxxxxx_xxxxxxxx_xxx_xxxxxxxxxx=xxxxx&xxxxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xxxxxxxxxx=xxxxxxx&xxxxxxxx_xxx_xx=xxxxxxx_2x542x7x-7x94-4867-8819-239x732xx3x1&xxxxxxxxxxxxx_xxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xxxxxxxxxxxxxxx=xxxxx&xxxxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xxxxxxxxxxxxxx=xx-xx&xxxxxxx_xxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xxxxxxxx=7&xxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xxxxxxxxxxxxx=xxx2012x2xx.xxx.xxx:82&xxxxxxx_xxxxxxxxx_xxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xxxxxxx=11.0&xxxxxxxxx_xxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xxxxxxx=xxxx&xxxxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xxxxxxxxxxxx=xxxxxxxxx&xx_xxxxxxxxx_xxxxxxxxxxxxxxxx_xxxxxxxxxxx_xxxxx_xxx_xxxxxxx=xx 6.3&xxxxxxxxxxx_xxxxx_xxx_xxxxxxxxxxxxxxxxxxx=<xxxxxxx-xxxxx xxxxx="xxx">xxxxxx xxxxxx"></xxxxxxx><xxxxxxx-xxxx xxx-xxxxx="xx_xxxx" xxxxxxxx="xxxx" xxxx="xxxxxxxxxxx xxxx"><xxxx-xx-xxxxxx xxxxxxxxxxx="xxxx"><xxxxx>xxxxxxxxxx</xxxxx><xxxxx>xxxxx</xxxxx><xxxxx>xxx</xxxxx><xxxxx>xxxxxxxxx</xxxxx><xxxxx>xxxxxxx</xxxxx></xxxx-xx-xxxxxx></xxxxxxx-xxxx><xxxxxxx-xxxx xxx-xxxxx="xx_xxxxxxxx" xxxxxxxx="xxxxxxxx" xxxx="xx_xxxxxxxx"/><xxxxxxx-xxxx xxx-xxxxx="xx_xx_xxxxx" xxxxxxxx="xxxx" xxxx="xxxxxxx - xxxxxx xxxxxx?"><xxxx-xx-xxxxxx xxxxxxxxxxx="xxxxx"> 2</xxxxx></xxxx-xx-xxxxxx><xxxxx>xxxx</xxxxx><xxxxx>xxxxx</xxxxx></xxxx-xx-xxxxxx></xxxxxxx-xxxx><xxxxxxx-xxxx xxx-xxxxx="xx_xxxx_xxxx" xxxxxxxx="xxxx" xxxx="xx_xxxx_xxxx"></xxxxxxx><xxxxxxx-xxxx xxx-xxxxx="xx_xxxxxxx" xxxxxxxx="xxxxxx" xxxx="xx_xxxxxxx"></xxxxxxx><xxxxxxx-xxxx xxx-xxxxx="xx_xx_xxxxxxxxxxxxxx_xxxxxx" xxxxxxxx="xxxx"xxxx="xxxxxxx - xxxxxxxxxxxxxx xxxxxx"></xxxxxxx><xxxxxxx-xxxx xxx-xxxxx="xx_xxxxxx" xxxxxxxx="xxxx" xxxx="xxxxxxxxxxx xxxxxx">') 

Ich bekomme StackOverflowError:

Exception in thread "main" java.lang.StackOverflowError 
    at java.util.regex.Pattern$Branch.match(Pattern.java:4600) 
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658) 
    at java.util.regex.Pattern$Loop.match(Pattern.java:4785) 
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717) 
    at java.util.regex.Pattern$BranchConn.match(Pattern.java:4568) 
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4717) 
    at java.util.regex.Pattern$CharProperty.match(Pattern.java:3777) 
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4658) 

Was könnte das Problem sein? Ist eine solche Ausnahme wegen zu langer Länge der Zeichenfolge (2030 Symbole) möglich? Oder habe ich hier spezielle Symbole, die diese Fehler verursachen?

Irgendwelche Gedanken

+0

@anubhava es immer noch eine Ausnahme – ServerSideCat

Antwort

2

Zunächst einmal geschätzt, man die inneren Aufnahmegruppen nicht benötigen. Wiederholte Erfassungsgruppen erfassen nur das letzte Vorkommen, daher sind sie in Java nutzlos.

Als nächstes können Sie diese Regex unroll so dass es linear entspricht (ohne Wechsel, die eine Menge von Ressourcen frisst):

[^']*(?:''[^']*)* 

die updated regex Demo ansehen.

Muster Details:

  • [^']* - entspricht null oder mehr Zeichen andere als '
  • (?:''[^']*)* - entspricht null oder mehrere Sequenzen von:
    • '' - zwei Einzel Apostrophe
    • [^']* - null oder mehr Zeichen außer '
+0

Sie Wiktor danken hat. Es hilft mir. Könnten Sie mir Ratschläge geben, wie man Regexp lernt, um sich über effiziente Nutzung zu informieren? irgendwelche Bücher, Kurse? – ServerSideCat

+0

OReiley's Mastering Regular Expressions gilt als das beste Lehrbuch. Überprüfe SO regelmäßig, es gibt einen Typ, der die Regex-Leistung hier sehr gut beherrscht. Nun, es gibt mehr, aber sie tauchen nicht oft auf. –

+0

Sieh Casimir et Hyppolyte Beiträge, sie sind wirklich neugierig. nhahtdh ist auch ein Guru der Regex (er lebt sogar auf dem Mond :-D) –