Java 正则表达式从errorString中捕获多个单词

Java 正则表达式从errorString中捕获多个单词,java,regex,regex-group,Java,Regex,Regex Group,我有一个字符串,它基本上包含错误信息,我想从错误字符串中捕获重要信息 我有下面的错误字符串 trackingID=jskdf-77sdkj-oij4-kerj43-lklfds; key1=lksfjsdkjfkslkdjf; key2=skjfjdkfj43jrkjskd; key3=lksfjsdkjfkslkdjf; key4=skjfjdkfj43jrkjskd; { "info":{ "details":[ { "co

我有一个字符串,它基本上包含错误信息,我想从错误字符串中捕获重要信息

我有下面的错误字符串

trackingID=jskdf-77sdkj-oij4-kerj43-lklfds; 
key1=lksfjsdkjfkslkdjf;
key2=skjfjdkfj43jrkjskd;
key3=lksfjsdkjfkslkdjf;
key4=skjfjdkfj43jrkjskd;


{
    "info":{
      "details":[
         {
            "code":"ABC23423",
            "messages":"msg:INVALID_ERROR",
            "timeStamp":"2019-08-30T15:03:43.668Z"
         }
      ],
      "$httpStatus":400
   },
   "status":400,
   "test":"ABC2342fdsff3",
   "contactDetails":{
      "primaryCommunication":{
         "addressLine1":"231 London 71",
         "addressLine2":"",
         "addressLine3":"",
         "city":"London",
         "country":"England",
         "countryCode":"GB",
         "postalCode":"TW33ER",
         "usage":"Home",
         "county":"ENGLAND",
         "stateCode":"",
         "state":""
      },
      "name":{
         "number":"45765767343",
         "title":"Mr",
         "firstName":"Nitin",
         "lastName":"Dumbre",
         "address":"nitin-d@gmail.com",
         "code":"+44"
      },
      "email":{
         "address":"nitin-d@gmail.come"
      },
      "phone":[
         {
            "number":"44 7647632746732",
            "code":"Home"
         }
      ],
      "preferredCountry":{
         "code":""
      },
      "preferredLanguage":""
   }
}
我想捕获以下属性值:

  • 跟踪ID
  • 代码
  • 信息
  • 地位
  • 我在下面的正则表达式中创建了这些细节

    (trackingID|\\"code|\"messages|\"status\\")(=|\\":\\"|:)([^(;|\\"|,)]*)
    
    上述正则表达式在所有情况下都不起作用。例如,给定字符串
    \“code\”:\“
    多次出现,因此代码值被覆盖

    我想捕获值code属性,它位于
    \“messages\”:\“
    属性之前


    您能帮我改进正则表达式吗?

    要解决您的问题,您可以使用GSON而不是正则表达式,它将是更干净、更不复杂的解决方案。

    同意使用JSON解析器是干净的,但是,并非所有的
    字符串
    都是JSON,因此在将其解析为
    映射
    或您拥有的某个对象之前,您需要某种解析来提取
    TrackingId
    ,并提取JSON字符串本身

    我不想费心,只要一行一行地从一开始就确定我想要的行,然后:

    • =
      上拆分:
    • 通过移除
    这可以通过通用方法完成,因为它们或多或少遵循相同的格式。并且您想要的
    “code”
    字段是第一个字段

    private static String extract(String[] errorLines, String lineStart) {
        return Arrays.stream(errorLines)
                .map(String::trim) // remove spaces at the beginning
                .filter(s -> s.startsWith(lineStart)) // filter lines starting with the value
                .findFirst()// take the first one
                .map(s -> s.split("[=:]", 2)[1]) // split and take the second half
                .map(s -> s.replaceAll("[;\",]", "")) // remove unwanted characters
                .orElse("");
    }
    
    然后,
    错误
    是您的字符串:

    String[] errorLines = error.split("\n");
    
    Stream.of("trackingID", "\"code\":", "\"messages\":", "\"$httpStatus\":")
          .map(s -> extract(errorLines, s))
          .forEach(System.out::println);
    
    产出:

    jskdf-77sdkj-oij4-kerj43-lklfds
    ABC23423
    msg:INVALID_ERROR
    400
    

    我认为您的问题中需要一个json解析器,而不是regext。这应该是一个注释。