【问题标题】:JAVA regex to get entire json from textJAVA正则表达式从文本中获取整个json
【发布时间】:2019-12-12 06:08:05
【问题描述】:

我有一个文本,里面有一个有效的 json,我想使用正则表达式提取整个 json。我可以在 javascript 中使用简单的正则表达式{.*},但在 java 中不行。我想要一个与 java 兼容的正则表达式。

具有有效 json 的示例文本:

data:""{"_id": {"$oid": "gdgdgdr"},"code": "grdgd34","name": "name1","desc": "desc","transRefId": "5debeeed8df45b0314569caa","origAmount": 1000,"amount": 1000,"currency": "USD","redeemedCashcode": "dwdw","sender": {"id": "FESFS","name": "rose","phone": "3424234232"},"receiver": {"id": "5d04c70c65c79dedb21080e1","name": "Move money from bank to wallet","phone": "63454332422","client": "biller"},"beneficiary": {},"depositor": {},"offer": "42efsgf"}""

我在java中尝试过的正则表达式是:\\{.*\\}

我将如何在 JAVA 中实现相同的目标?

【问题讨论】:

  • 你能分享一下你在java中做了什么吗?
  • {.*} 给出“无法执行正则表达式。java.util.regex.PatternSyntaxException:非法重复 {.*}”错误
  • 我已经用它更新了这个问题@soorapadman
  • 你能展示你的Java代码吗?
  • 我打算在 wso2sp 中使用这个正则表达式,因为这个平台是基于 java 的,正则表达式需要是 JAVA 格式,我正在freeformatter.com/java-regex-tester.html测试上面的正则表达式

标签: java regex regex-group


【解决方案1】:

当然,您的正则表达式在 Java 中工作得非常好。

然而,你不应该匹配整个字符串,你应该搜索匹配inside字符串,为此你使用Matcher#find(因为String本身没有方便的方法):

String data = "data:\"\"{\"_id\": {\"$oid\": \"gdgdgdr\"},\"code\": \"grdgd34\",\"name\": \"name1\",\"desc\": \"desc\",\"transRefId\": \"5debeeed8df45b0314569caa\",\"origAmount\": 1000,\"amount\": 1000,\"currency\": \"USD\",\"redeemedCashcode\": \"dwdw\",\"sender\": {\"id\": \"FESFS\",\"name\": \"rose\",\"phone\": \"3424234232\"},\"receiver\": {\"id\": \"5d04c70c65c79dedb21080e1\",\"name\": \"Move money from bank to wallet\",\"phone\": \"63454332422\",\"client\": \"biller\"},\"beneficiary\": {},\"depositor\": {},\"offer\": \"42efsgf\"}\"\"";

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

打印:

{"_id": {"$oid": "gdgdgdr"},"code": "grdgd34","name": "name1","desc": "desc","transRefId": "5debeeed8df45b0314569caa","origAmount": 1000,"amount": 1000,"currency": "USD","redeemedCashcode": "dwdw","sender": {"id": "FESFS","name": "rose","phone": "3424234232"},"receiver": {"id": "5d04c70c65c79dedb21080e1","name": "Move money from bank to wallet","phone": "63454332422","client": "biller"},"beneficiary": {},"depositor": {},"offer": "42efsgf"}

【讨论】:

    【解决方案2】:

    我已经测试并且你的正则表达式有效,这是测试和结果

    final String regex = "\\{.*\\}";
        final String string = "data:\"\"{\"_id\": {\"$oid\": \"gdgdgdr\"},\"code\": \"grdgd34\",\"name\": \"name1\",\"desc\": \"desc\",\"transRefId\": \"5debeeed8df45b0314569caa\",\"origAmount\": 1000,\"amount\": 1000,\"currency\": \"USD\",\"redeemedCashcode\": \"dwdw\",\"sender\": {\"id\": \"FESFS\",\"name\": \"rose\",\"phone\": \"3424234232\"},\"receiver\": {\"id\": \"5d04c70c65c79dedb21080e1\",\"name\": \"Move money from bank to wallet\",\"phone\": \"63454332422\",\"client\": \"biller\"},\"beneficiary\": {},\"depositor\": {},\"offer\": \"42efsgf\"}\"\"";
    
        final Pattern pattern = Pattern.compile(regex, Pattern.MULTILINE);
        final Matcher matcher = pattern.matcher(string);
        matcher.find();
        System.out.println(matcher.group(0));
    

    结果是:

    {"_id": {"$oid": "gdgdgdr"},"code": "grdgd34","name": "name1","desc": "desc","transRefId": "5debeeed8df45b0314569caa","origAmount": 1000,"amount": 1000,"currency": "USD","redeemedCashcode": "dwdw","sender": {"id": "FESFS","name": "rose","phone": "3424234232"},"receiver": {"id": "5d04c70c65c79dedb21080e1","name": "Move money from bank to wallet","phone": "63454332422","client": "biller"},"beneficiary": {},"depositor": {},"offer": "42efsgf"}
    

    java 对正则表达式没有任何特定的标准。 \\{.*\\} - 只是字符串转义的正则表达式。在 java 中,\ 用于转义一些特殊字符,所以如果你想将此 char 用作字符串作为常规字符,还必须使用额外的\ 进行转义。 String a = "\\" 解析为只有一个 \ 的字符串。 所以 "\\{.*\\}" 解析为正则表达式“\{.*\}”,其中\ 也是 egexp 处理器将 { and } 作为符号而不是特殊字符处理的转义字符

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-12-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多