2011-08-02 38 views
1

我想通过在Java中使用正则表达式从异常中提取值。但该字符串是太复杂和长(全部在一行中):JavaRegEx和复杂的长字符串

响应码= {缬氨酸= 9002; SubVal = 9203;文本=未发现订户};消息=订户未发现;未发现LocalizedMessage =订户;原因== NULL;堆栈跟踪= {[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(Unknown Source)] [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)] [融为一体。 sun.xml.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(HttpServlet.java:727)] [weblogic的。 wsee.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。 security.service.SecurityManager.runAs(Unknown Source)] [weblogic.servlet.internal.WebAppServletContext.securedExecute(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+)(?:(?:.)*)$ 

我得到这个例外:

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) 

如何守ld我通过使用Java RegEx从该字符串中提取Val和SubVal值?

+0

如果VAL和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