Java RegEx和复杂的长字符串

时间:2011-08-02 16:38:15

标签: java regex

我试图通过在Java中使用正则表达式从异常中提取值。但是这个字符串太复杂而且很长(全部在一行中):

  

ReturnCode = {Val = 9002; SubVal = 9203; Text = Subscriber not found}; Message =未找到订阅者; LocalizedMessage =未找到订阅者;原因== null; StackTrace = {[co.com.tigo.gatewaytigo。 scp.mcommerce.method.RechargeMCommerce.getRechargeResult(RechargeMCommerce.java:72)] [co.com.tigo.gatewaytigo.scp.mcommerce.MCommerceAPI.recharge(MCommerceAPI.java:353)] [co.com.tigo.gatewaytigo。 scp.interfacesscp.SCPFacade.recharge(SCPFacade.java:257)] [co.com.tigo.gatewaytigo.webscp.ws.GatewayTigoWS.recharge(Unknown Source)] [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.invok E(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.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.HttpServletAdapter.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)] [weblogi c.work.ExecuteThread.run(ExecuteThread.java:173)]}

我想从该字符串中提取Val和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)

如何使用Java RegEx从该字符串中提取Val和SubVal值?

2 个答案:

答案 0 :(得分:3)

我看到很多无关紧要的比赛;为什么简单的[{]Val=(\\d+);SubVal=(\\d+);不起作用?

答案 1 :(得分: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));
}

(当然,如果您多次这样做,请将Pattern设置为一些静态变量,以避免每次使用时重新编译它。)