正则表达式匹配JSON编码的字符串

时间:2017-06-30 09:15:21

标签: java json string

您好我一直在尝试使用Java创建一个Regex来匹配使用json_encode转换为字符串的JSON数据。我一直在阅读有关stackoverflow的示例,但我不确定它们只与纯JSON或包含JSON表示的字符串相关。我尝试过应用但不能让它们起作用。

看这里:

Regex to validate JSON

在这里:

Regex to match a JSON String

这是我试图使用我的正则表达式匹配的字符串:

[{"resourceUri":"file:\/home\/admin\/test-modeling\/apache-tomcat-7.0.70\/temp\/IOS\/filetest-file-files.txt#\/\/@statements.12\/@typeList.0\/@enumLiterals.11","severity":"WARNING","lineNumber":333,"column":9,"offset":7780,"length":24,"message":"Enum name should be less than 20 characters"}]

我尝试使用这个答案,当我使用regex101进行测试时,它匹配得很好。

https://stackoverflow.com/a/6249375/5476612

我在这里使用这个正则表达式:

/\A("([^"\\]*|\\["\\bfnrt\/]|\\u[0-9a-f]{4})*"|-?(?=[1-9]|0(?!\d))\d+(\.\d+)?([eE][+-]?\d+)?|true|false|null|\[(?:(?1)(?:,(?1))*)?\s*\]|\{(?:\s*"([^"\\]*|\\["\\bfnrt\/]|\\u[0-9a-f]{4})*"\s*:(?1)(?:,\s*"([^"\\]*|\\["\\bfnrt\/]|\\u[0-9a-f]{4})*"\s*:(?1))*)?\s*\})\Z/is

但是,当我尝试在Java中将其用作字符串时,我会遇到转义字符问题。

任何人都可以帮我修复正则表达式,以便在Java中使用String或帮助我创建一个可以工作的字符串吗?

编辑1:这是我正在查看的完整字符串,我正在尝试匹配上面的JSON字符串:

../../tool/model/toolingValidationReport.php?fileName=test-testing-types.txt&fileSize=18380&validationReport=[{"resourceUri":"file:\/home\/admin\/test-modeling\/apache-tomcat-7.0.70\/temp\/IOS\/filetest-file-files.txt#\/\/@statements.12\/@typeList.0\/@enumLiterals.11","severity":"WARNING","lineNumber":333,"column":9,"offset":7780,"length":24,"message":"Enum name should be less than 20 characters"}] target=

编辑2:这是我用来执行正则表达式检查的Java。 href变量包含编辑1中显示的字符串内容。

Pattern validationReportPattern = Pattern.compile(getValidationReportPattern());
Matcher validationReportMatcher = validationReportPattern.matcher(href);

public String getYangValidationReportPattern(){
   return "(\\[\\{.*\\}])"; 
}

String validationReport  = validationReportMatcher.group(1);

1 个答案:

答案 0 :(得分:1)

Java中的正则表达式模式必须是"(\\[\\{.*}])",但真正的问题是没有尝试匹配。在致电find()之前,您必须致电group()

如果你这样做,see here online at ideone

<强>输出:

Match: [{"resourceUri":"file:\/home\/admin\/test-modeling\/apache-tomcat-7.0.70\/temp\/IOS\/filetest-file-files.txt#\/\/@statements.12\/@typeList.0\/@enumLiterals.11","severity":"WARNING","lineNumber":333,"column":9,"offset":7780,"length":24,"message":"Enum name should be less than 20 characters"}]

find()方法返回一个布尔值,以便您可以检查是否存在。 如果您不首先使用find()检查,则会获得java.lang.IllegalStateException: No match found例外。

if (validationReportMatcher.find())
{
   String validationReport  = validationReportMatcher.group(1);
   System.out.println ("Match: " + validationReport);
}
else
{
   System.out.println ("No match");
}

如果您需要搜索多个匹配项,请在while循环中调用find()

while (validationReportMatcher.find())
{
   String validationReport  = validationReportMatcher.group(1);
   System.out.println ("Match: " + validationReport);
}

但这似乎不是必要的,因为你只是寻找一次。