当前位置: 首页 > 知识库问答 >
问题:

(定义)正则表达式中的功能在Java中不起作用

严曜文
2023-03-14

我正在尝试使用正则表达式验证JSON字符串。从另一个帖子中找到了有效的正则表达式https://stackoverflow.com/a/3845829/7493427它使用regex中的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是有效的,所以我希望匹配,但我得到了一个异常。

线程"main"jregex中的异常。在jregex定义未知的组名称。Term.make树(Term.java:360)在jregex。在jregex的Term.make树(Term.java:219)。erm.make树(erm.java:206)在jregex。jregex的Pattern.compile(Pattern.java:164)。模式。attern.java:150)在jregex。模式。Pattern.java:108)在com.cloak.utilities.regex.变量验证elper.main(变量验证elper.java:305)

共有1个答案

陶博涉
2023-03-14

您可以使用这个相当简单的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()在输入无效时将抛出JsonProcessingExc0019s(IOExc0019的子类)。

 类似资料:
  • 我要匹配以下字符串: 包含unicode空格(不要问我为什么)<代码>/,\s*,/u在regex101中工作正常。 但是(?u),\s*,“在clojure中不起作用: 为什么会失败?

  • 问题内容: 我有一个正则表达式: 这应该与该字符串匹配并返回三个捕获(根据Rubular) 这是我的代码: 当有三个时,此打印输出1(组),所以我只能这样做,只会返回32。 问题答案: 调用查找匹配的 下一个 实例,如果没有更多实例,则返回false。尝试调用它三次,看看是否有所有预期的组。 为了澄清,正在尝试 在正则表达式中 找到第一个组 表达式 。您的正则表达式中只有一个这样的组表达式,因此永

  • 正则表达式非常简单: 这在Neo4j服务器web控制台中有效。我收到了预期的结果。 当我通过Java使用REST接口时,我必须将regex更改为:(添加了反斜杠)。我不明白为什么,但它确实有效(再次返回了预期结果)。 相同的正则表达式不适用于嵌入式Neo4j: 请注意 不会显示在错误日志中(至少在 Intellij 控制台上)。 更糟糕的是< code > "(?我)。* \ \ baaaaaaa

  • 问题内容: 我和我的朋友正在尝试创建一种算法来计算输入的数字之后不会重复的数字(例如)。 感兴趣的代码是: 由于某种原因,即使将其设置为,也将其设置为。每个输出的结果将与输入具有相同的值。 这是什么问题,我们将如何更改逻辑,以便当数字中的数字重复时,检查器返回假? 问题答案: 考虑这些行 有一些问题。我认为您缺少牙套。和你忘了更新checker的时候matcher.find()是假的。我建议你改为

  • 我正在搜索正则表达式-"。(冲突的副本。"。我为此写了以下代码 但我有个例外 异常在线程"main"中java.util.regex.Pattern Syn的异常:索引15附近的未关闭组。( 我知道编译器认为是模式组的开始。我试图通过添加来逃避),但这不起作用。 有人能告诉我怎么逃走吗?

  • 昨天,我需要向正则表达式添加一个文件路径,创建一个如下所示的模式: 一开始正则表达式不匹配,因为包含几个正则表达式特定的符号,如 或 。作为快速修复,我将它们替换为 和 . 与 . 然而,我问自己,是否没有一种更可靠或更好的方法来清除正则表达式特定符号中的字符串。 Python 标准库中是否支持此类功能? 如果没有,您是否知道一个正则表达式来识别所有正则表达式并通过替代品清理它们?