Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaRegEx和复杂长字符串_Java_Regex - Fatal编程技术网

JavaRegEx和复杂长字符串

JavaRegEx和复杂长字符串,java,regex,Java,Regex,我试图在Java中使用正则表达式从异常中提取值。但是字符串太复杂太长(都在一行中): ReturnCode={Val=9002;SubVal=9203;Text=Subscriber not found};Message=未找到订户;LocalizedMessage=未找到订户;原因==null;StackTrace={[co.com.tigo.gatewaytigo.scp.mcommerce.method.recharemcommerce.getRechargeResult(recharem

我试图在Java中使用正则表达式从异常中提取值。但是字符串太复杂太长(都在一行中):

ReturnCode={Val=9002;SubVal=9203;Text=Subscriber not found};Message=未找到订户;LocalizedMessage=未找到订户;原因==null;StackTrace={[co.com.tigo.gatewaytigo.scp.mcommerce.method.recharemcommerce.getRechargeResult(recharemcommerce.java:72)][co.com.tigo.gatewaytigo.scp.mcommerce.MCommerceAPI.recharge(MCommerceAPI.java:353)][co.com.tigo.gatewaytigo.gatewaytigo.scp.interfacesscp.SCPFacade.recharge(SCPFacade.java:257)][co.com.tigo.gatewaytigo.webs.gatewaytigo.com(未知源)][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.server.sei.EndpointMethodHandler.invoke(EndpointMethodHandler.java:257)][com.sun.xml.ws.ws.server.sei.seinvokertube.processRequest(seinvokertube.java:93)][com.sun.xml.ws.api.pipe.Fiber.[uuu-doRun(Fiber.java:598)][com.sun.xml.ws.api.pipe.Fiber.[uu-doRun(Fiber.java:557)][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.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(未知源)][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.ExecuteThread(ExecuteThread.java:201)][weblogic.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正则表达式从该字符串中提取该Val和SubVal值?

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

我看到了很多无关的匹配;为什么简单的
[{]Val=(\\d+);SubVal=(\\d+)
工作?

Java的RE引擎在包含替代项的重复中存在一些问题:它们被编译为递归函数,而在长字符串(如您的)上,您会得到StackOverflower错误

我不知道为什么您在开始时需要
^(?:(?:.|\\n |\\r)*)
,在结束时需要
(?:(?:)*)$
-如果您使用
查找
而不是
匹配项,没有这些,这不是也可以工作吗

下面是一些示例代码:

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));
}

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

Java的RE引擎在包含替代项的重复中存在一些问题:它们被编译为递归函数,在长字符串(如您的)上,您会得到StackOverflower错误

我不知道为什么您在开始时需要
^(?:(?:.|\\n |\\r)*)
,在结束时需要
(?:(?:)*)$
-如果您使用
查找
而不是
匹配项,没有这些,这不是也可以工作吗

下面是一些示例代码:

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));
}

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

如果val和subval始终是数字的,那么基于
val=
subval=
的索引进行解析会更好,并将结尾引用为
作为终点。我们只能使用java正则表达式模式如果val和subval始终是数字的,那么基于
val=
的索引进行解析会更好
SubVal=
并引用结尾处的
作为结束点。我们只能使用java正则表达式模式。我将模式更改为^Val=(\\d+);SubVal=(\\d+)$,它可以工作。非常感谢您的帮助:)您确定这里的
^
$
是否正确?这看起来好像不起作用。这个简单的文本怎么样:ReturnCode={Val=9002;SubVal=9203;text=Subscriber not found}这个模式匹配并且可以被捕获:^(?:(?:。| \\n| \\r)*)Val=\\d+;SubVal=\\d+;(?:(?:。\\n| \\n|\\r)*+)$I将模式更改为^Val=\\d+;SubVal=\\d+$有效。非常感谢您的帮助:)您确定这里的
^
$
有效吗?这看起来好像不起作用。这个简单的文本如何:ReturnCode={Val=9002;SubVal=9203;text=Subscriber not found}这个模式匹配并且可以