java - 正则表达式中的 (DEFINE) 功能在 Java 中不起作用
问题描述
我正在尝试使用正则表达式验证 JSON 字符串。从另一篇文章https://stackoverflow.com/a/3845829/7493427中找到了有效的正则表达式 它在正则表达式中使用了 DEFINE 功能。但我认为 JRegex 库不支持该功能。有解决办法吗?
我首先使用了 java.util.regex,然后发现了 JRegex 库。但这也行不通。
String regex = "(?(DEFINE)" +
"(?<number> -? (?= [1-9]|0(?!\\d) ) \\d+ (\\.\\d+)? ([eE] [+-]?
\\d+)? )" +
"(?<boolean> true | false | null )" +
"(?<string> \" ([^\"\\n\\r\\t\\\\\\\\]* | \\\\\\\\
[\"\\\\\\\\bfnrt\\/] | \\\\\\\\ u [0-9a-f]{4} )* \" )" +
"(?<array> \\[ (?: (?&json) (?: , (?&json) )* )? \\s*
\\] )" +
"(?<pair> \\s* (?&string) \\s* : (?&json) )" +
"(?<object> \\{ (?: (?&pair) (?: , (?&pair) )* )? \\s*
\\} )" +
"(?<json> \\s* (?: (?&number) | (?&boolean) | (?&string) | (?
&array) | (?&object) ) \\s* )" +
")" +
"\\A (?&json) \\Z";
String test = "{\"asd\" : \"asdasdasdasdasdasd\"}";
jregex.Pattern pattern = new jregex.Pattern(regex);
jregex.Matcher matcher = pattern.matcher(test);
if(matcher.find()) {
System.out.println(matcher.groups());
}
我期望匹配,因为测试 json 是有效的,但我得到了一个例外。
线程“主”jregex.PatternSyntaxException 中的异常:条件表达式中的未知组名:在 jregex.Term.makeTree(Term.java:219)在 jregex.Term 的 jregex.Term.makeTree(Term.java:360)处定义。 makeTree(Term.java:206) 在 jregex.Pattern.compile(Pattern.java:164) 在 jregex.Pattern.(Pattern.java:150) 在 jregex.Pattern.(Pattern.java:108) 在 com.cloak。实用程序.regex.VariableValidationHelper.main(VariableValidationHelper.java:305)
解决方案
您可以使用这个相当简单的 Jackson 设置:
private static final ObjectMapper MAPPER = new ObjectMapper();
public static boolean isValidJson(String json) {
try {
MAPPER.readValue(json, Map.class);
return true;
} catch(IOException e) {
return false;
}
}
ObjectMapper#readValue()
当输入无效时将抛出JsonProcessingException
s ( 的子类)。IOException
推荐阅读
- mysql - MySQL XDevAPI 如何返回成功状态
- sql-server - 使用 SSRS MAX 函数时消除一些大值
- java - 如何从 2 个不同的 Spring Boot 应用程序访问相同的数据库
- reactjs - Apollo-Client 中的 dotenv 不起作用
- python - 在 Python 3.7/Django 3 中,如何在 Web 浏览器中获取页面的呈现 HTML?
- c# - 执行此 sql 查询时如何只获得一个值?
- r - 如何在 rmarkdown 代码块中解析文本表
- javascript - 如何使用引导程序使表格内的单选按钮看起来像一个按钮?
- flutter - 将分隔符添加到 ListTile
- netlogo - 如何删除netlogo中两个链接中的较低者