您好我一直在尝试使用Java创建一个Regex来匹配使用json_encode转换为字符串的JSON数据。我一直在阅读有关stackoverflow的示例,但我不确定它们只与纯JSON或包含JSON表示的字符串相关。我尝试过应用但不能让它们起作用。
看这里:
在这里:
这是我试图使用我的正则表达式匹配的字符串:
[{"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);
答案 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);
}
但这似乎不是必要的,因为你只是寻找一次。