Функция (DEFINE) в регулярных выражениях не работает в Java - PullRequest
0 голосов
/ 01 мая 2019

Я пытаюсь проверить строку 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 действителен, но я получил исключение.

Исключение в потоке "main" jregex.PatternSyntaxException: неизвестное имя группы в условном выражении: DEFINE в jregex.Term.makeTree (Term.java:360) в jregex.Term.makeTree (Term.java:219) в jregex.Term.makeTree (Term.java:206) в jregex.Pattern.compile (Pattern.java:164) в jregex.Pattern. (Pattern.java:150) в jregex.Pattern. (Pattern.java:108) в com.cloak.utilities.regex.VariableValidationHelper.main(VariableValidationHelper.java:305)

1 Ответ

0 голосов
/ 01 мая 2019

Вы можете использовать эту довольно простую установку Джексона:

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 с (подкласс IOException), когда ввод неверен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...