简体   繁体   中英

regex expression to extract a string

i want to extract [{"type":"MAPPINGTYPE","target":1,"source":0},{"type":"OWNEDOBJECTS","target":3,"source":0},{"type":"APIFILES","target":2,"source":1}] from the following string :

String json="links":[{"type":"MAPPINGTYPE","target":1,"source":0},{"type":"OWNEDOBJECTS","target":3,"source":0},{"type":"APIFILES","target":2,"source":1}],

im using the following code without result:

Pattern pattern = Pattern.compile("[(.*?)]");
Matcher matcher = pattern.matcher(json);
if (matcher.find())
{
   System.out.println(matcher.group(0));
}

the original probleme is the following: i havea JSONfile that is litlle messed up:

{
    "links":[{"type":"MAPPINGTYPE","target":1,"source":0},{"type":"OWNEDOBJECTS","target":3,"source":0},{"type":"APIFILES","target":2,"source":1}],
    "nodes":[{"label":["ClassDefinition","_ClassDefinition","_AbstractEntity"],"name":"HexStringParser"}],
    "links":[{"type":"MAPPINGTYPE","target":1,"source":0},{"type":"OWNEDOBJECTS","target":3,"source":0},{"type":"APIFILES","target":2,"source":1}],
    "nodes":[{"label":["ClassDefinition","_ClassDefinition","_AbstractEntity"],"name":"HexStringParser"}]
}

as you can see there is a duplucation of links and nodes i would like to merge them (not delete the duplication) to have a JSON like this :

{
    "links":[{"type":"MAPPINGTYPE","target":1,"source":0},{"type":"OWNEDOBJECTS","target":3,"source":0},{"type":"APIFILES","target":2,"source":1},{"type":"MAPPINGTYPE","target":1,"source":0},{"type":"OWNEDOBJECTS","target":3,"source":0},{"type":"APIFILES","target":2,"source":1}],
    "nodes":[{"label":["ClassDefinition","_ClassDefinition","_AbstractEntity"],"name":"HexStringParser"},{"label":["ClassDefinition","_ClassDefinition","_AbstractEntity"],"name":"HexStringParser"}],
}

i have tried the json parser

Map<String,String[]> map = new HashMap<String,String[]>();
ObjectMapper mapper = new ObjectMapper();
try {
    //convert JSON string to Map
    map = mapper.readValue(json, 
    new TypeReference<HashMap<String,String[]>>(){});
    System.out.println(map);

    } catch (Exception e) {
          e.printStackTrace();
    }

but i get this stack trace:

org.codehaus.jackson.map.JsonMappingException: Can not deserialize instance of java.lang.String[] out of VALUE_STRING token
 at [Source: java.io.StringReader@3d0b8bc1; line: 1, column: 219]
    at org.codehaus.jackson.map.JsonMappingException.from(JsonMappingException.java:163)
    at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:219)
    at org.codehaus.jackson.map.deser.StdDeserializationContext.mappingException(StdDeserializationContext.java:212)
    at org.codehaus.jackson.map.deser.std.PrimitiveArrayDeserializers$StringDeser.handleNonArray(PrimitiveArrayDeserializers.java:153)
    at org.codehaus.jackson.map.deser.std.PrimitiveArrayDeserializers$StringDeser.deserialize(PrimitiveArrayDeserializers.java:119)
    at org.codehaus.jackson.map.deser.std.PrimitiveArrayDeserializers$StringDeser.deserialize(PrimitiveArrayDeserializers.java:107)
    at org.codehaus.jackson.map.deser.std.MapDeserializer._readAndBind(MapDeserializer.java:319)
    at org.codehaus.jackson.map.deser.std.MapDeserializer.deserialize(MapDeserializer.java:249)
    at org.codehaus.jackson.map.deser.std.MapDeserializer.deserialize(MapDeserializer.java:33)
    at org.codehaus.jackson.map.ObjectMapper._readMapAndClose(ObjectMapper.java:2732)
    at org.codehaus.jackson.map.ObjectMapper.readValue(ObjectMapper.java:1870)
    at com.MyAppConverter.MapTool.HomeController.checkMapping(HomeController.java:174)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:214)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:852)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:618)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118)
    at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.rememberme.RememberMeAuthenticationFilter.doFilter(RememberMeAuthenticationFilter.java:146)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.www.BasicAuthenticationFilter.doFilter(BasicAuthenticationFilter.java:150)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50)
    at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:108)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87)
    at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342)
    at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192)
    at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160)
    at org.springframework.web.filter.DelegatingFilterProxy.invokeDelegate(DelegatingFilterProxy.java:344)
    at org.springframework.web.filter.DelegatingFilterProxy.doFilter(DelegatingFilterProxy.java:261)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
    at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085)
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:146)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:279)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
    at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
    at java.lang.Thread.run(Thread.java:745)

Use pattern: "\\\\[.*\\\\]"

Example:

    Pattern pattern = Pattern.compile("\\[.*\\]");
    Matcher matcher = pattern.matcher(json);
    if (matcher.find())
    {
        System.out.println(matcher.group());
    }

You need to escape [ , ] characters because [ is a special character in regex which refers the start of a character class. So this [(.*?)] will match a single character from the given list whether it may be . or ( or * or ) or ? .

Pattern pattern = Pattern.compile("\\[(.*?)\\]");
Matcher matcher = pattern.matcher(json);
if (matcher.find())
{
   System.out.println(matcher.group(0));
}

You don't need to use capturing group.

Pattern pattern = Pattern.compile("\\[.*?\\]");

OR

Pattern pattern = Pattern.compile("\\[[^\\]]*\\]");

It looks like JSON string. Proper use Jackson or GSON JSON API to extract.

Tutorial

Convert JSON string to Map<String,String> and get the desired field.

String json = "{\"name\":\"mkyong\", \"age\":\"29\"}";

Map<String,String> map = new HashMap<String,String>();
ObjectMapper mapper = new ObjectMapper();

try {

    //convert JSON string to Map
    map = mapper.readValue(json, 
        new TypeReference<HashMap<String,String>>(){});

    System.out.println(map);

} catch (Exception e) {
    e.printStackTrace();
}

Using GSON API:

Type type = new TypeToken<Map<String, String>>() {}.getType();
Map<String, String> map=new Gson().fromJson(json, type);
System.out.println(map.get("links"));

Here is the valid JSON string:

{
    "links": [
        {
            "type": "MAPPINGTYPE",
            "target": 1,
            "source": 0
        },
        {
            "type": "OWNEDOBJECTS",
            "target": 3,
            "source": 0
        },
        {
            "type": "APIFILES",
            "target": 2,
            "source": 1
        }
    ]
}

只需使用一个\\来代替[]字符,因为它们已在正则表达式中保留:

\\[(.*?)\\]

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM