2011-08-02 5 views
1

Javaの正規表現を使用して例外から値を抽出しようとしています。しかし文字列は、(1行のすべての)あまりにも複雑で長い:JavaRegExと複雑な長い文字列

RETURNCODE = {ヴァル= 9002; SubVal = 9203;本文=サブスクライバが見つからない};見つからないメッセージ=サブスクライバ; LocalizedMessage =サブスクライバが見つかりません;原因== null; StackTrace = {[co.com.tigo.gatewaytigo.scp.mcommerce.method.RechargeMCommerce.getRechargeResult(RechargeMCommerce.java:72)] [co.com.tigo.gatewaytigo.scp.mcommerce.MCommerceAPI。充電(MCommerceAPI.java:353)] [co.com.tigo.gatewaytigo.scp.interfacesscp.SCPFacade.recharge(SCPFacade.java:257)] [co.com.tigo.gatewaytigo.webscp.ws.GatewayTigoWS.recharge(不明なソース)] [Sun.reflect.GeneratedMethodAccessor4092.invoke(不明なソース)] [Sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)] [java.lang.reflect.Method.invoke(Method.java:597) ] [weblogic.wsee.jaxws.WLSInstanceResolver $ WLSInvoker.invoke (WLSInstanceResolver.java:89)][weblogic.wsee.jaxws.WLSInstanceResolver$WLSInvoker.invoke(WLSInstanceResolver.java:71)][com.sun.xml.ws.server.InvokerTube$2.invoke(InvokerTube.java:146) ] [com.sun.xml.ws.server.sei.EndpointMethodHandler.invoke(EndpointMethodHandler.java:257)] [com.sun.xml.ws.server.sei.SEIInvokerTube.processRequest(SEIInvokerTube.java:93)] [ com.sun.xml.ws.api.pipe.Fiber .__ doRun(Fiber.java:598)] [com.sun.xml.ws.api.pipe.Fiber._doRun(Fiber.java:557)] [com。 sun.ws.api.pipe.Fiber.doRun(Fiber.java:542)] [com.sun.xml.ws.api.pipe.Fiber.runSync(Fiber.java:439)] [com.sun。 xml.ws.server.WSEndpointImpl $ 2.process(WSEndpointImpl.java:243)] [com.sun.xml.ws.transport.http.HttpAdapter $ HttpToolkit.handle(HttpAdapter.java:444)] [com.sun.xml .ws.transport.http.HttpAdapter.handle(HttpAdapter.java:244)] [com.sun.xml.ws.transport.http.servlet.ServletAdapter.handle(ServletAdapter.java:134)] [weblogic.wsee.jaxws .HttpServletAdapter $ AuthorizedInvoke.run(HttpServletAdapter.java:272)] [weblogic.wsee.jaxws.Http ServletAdapter.post(HttpServletAdapter.java:185)] [weblogic.wsee.jaxws.JAXWSServlet.doPost(JAXWSServlet.java:180)] [javax.servlet.http.HttpServlet.service(HttpServletAdapter.java:727)] [weblogic。 wser.jaxws.JAXWSServlet.service(JAXWSServlet.java:64)] [javax.servlet.http.HttpServlet.service(HttpServlet.java:820)] [weblogic.servlet.internal.StubSecurityHelper $ ServletServiceAction.run(StubSecurityHelper.java: 227)] [weblogic.servlet.internal.StubSecurityHelper.invokeServlet(StubSecurityHelper.java:125)] [weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:292)] [weblogic.servlet.internal.ServletStubImpl.execute( ServletStubImpl.java:175)][weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3498)][weblogic.security.acl.internal.AuthenticatedSubject.doAs(AuthenticatedSubject.java:321)][weblogic。 (WebAppServletContext.java:2180)。 ] [weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2086)] [weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1406)] [weblogic.work.ExecuteThread.execute(ExecuteThread.java: 201)] [weblogic.work.ExecuteThread.run(ExecuteThread.java:173)]}

私はその文字列からヴァルとSubValを抽出したいと私のパターンがある:

^(?:(?:.|\\n|\\r)*)Val=(\\d+);SubVal=(\\d+)(?:(?:.)*)$ 

Iこの例外があります:

Exception in thread "main" java.lang.StackOverflowError 
    at java.lang.String.charAt(String.java:685) 
    at java.lang.Character.codePointAt(Character.java:2335) 
    at java.util.regex.Pattern$CharProperty.match(Pattern.java:3344) 
    at java.util.regex.Pattern$Branch.match(Pattern.java:4114) 
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168) 
    at java.util.regex.Pattern$Loop.match(Pattern.java:4295) 
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227) 
    at java.util.regex.Pattern$BranchConn.match(Pattern.java:4078) 
    at java.util.regex.Pattern$CharProperty.match(Pattern.java:3345) 
    at java.util.regex.Pattern$Branch.match(Pattern.java:4114) 
    at java.util.regex.Pattern$GroupHead.match(Pattern.java:4168) 
    at java.util.regex.Pattern$Loop.match(Pattern.java:4295) 
    at java.util.regex.Pattern$GroupTail.match(Pattern.java:4227) 

私はJava RegExを使って、その文字列からそのValとSubValの値を抽出しますか?

+0

ヴァルとsubval場合常に数値であるので、 'Val ='と 'SubVal ='のインデックスに基づいて解析する方が良いでしょうし、終わりのポイントとして ';'を参照してください。 –

+0

私はJavaの正規表現パターンを使用する必要があります – Barcelona

答えて

3

私はたくさんの無関係なマッチを見ます。なぜ簡単な[{]Val=(\\d+);SubVal=(\\d+);は動作しませんか?

1

JavaのREエンジンには、繰り返しを含む繰り返しに関するいくつかの問題があります。それらは再帰関数にコンパイルされ、あなたのような長い文字列ではStackOverflowErrorが返されます。

私は最後にあなたは開始時に^(?:(?:.|\\n|\\r)*)を必要とする理由はわからない、と(?:(?:.)*)$ - すべきではないものをせずに、この作品、あまりにも、あなたがfind代わりのmatchesを使用している場合は?ここで

は、いくつかのサンプルコードです:

Pattern p = Pattern.compile("Val=(\\d+);SubVal=(\\d+);"); 

Matcher m = p.matcher(string); 
if(m.find()) { 
    int val = Integer.parseInt(m.group(1)); 
    int subVal = Integer.parseInt(m.group(2)); 
} 

(あなたはこれを複数回行う場合はもちろん、パターンのいくつかの静的変数は、それぞれの使用のためにそれを再コンパイルを避けるために作る。)

+0

私はパターンを^ Val =(\\ d +); SubVal =(\\ d +)$に変更して動作します。ありがとうございます。 – Barcelona

+0

ここでは '^'と '$'については確かですか?これはうまくいくかのように見えません。 –

+0

申し訳ありませんが、動作しません。どのように私は一致し、9002をキャプチャ??? – Barcelona

関連する問題