#java #regex
#java #Регулярное выражение
Вопрос:
В системе, над которой я работаю, есть некоторый устаревший код, который я хотел бы изменить, но не могу. Этот код хранит значения в карте, которая выглядит как следующая строка:
userId: "929290"; name: "Donnie Darko"; obj : {field1: "field"; field2: "field2"} phone: "666-6666";
Обратите внимание, что за object map не следует точка с запятой, в отличие от любой другой пары ключ / значение. Есть ли способ использовать регулярное выражение в Java и получить первый уровень этой карты, чтобы я мог иметь:
userId: "929290"
obj : {field1: "field"; field2: "field2"}
Мне нужен только первый уровень, я не собираюсь разбирать field1 и field2 по отдельности.
Ответ №1:
не уверен в данном варианте использования, но вот регулярные выражения, которые помогут вам его найти
Pattern userIdPattern = Pattern.compile("^userId:\s*"(\d )";.*$"); // will be the userId number
Pattern objPattern = Pattern.compile(".*(obj\s*:\s*{[^}] }).*"); //will be the JSON object inside
Matcher userIdMatcher = userIdPattern.matcher("userId: "929290"; name: "Donnie Darko"; obj : {field1: "field"; field2: "field2"} phone: "666-6666";");
if(userIdMatcher.find()){
System.out.println("userId : " .group(1));
}
Matcher objPatternMatcher = objPattern.matcher("userId: "929290"; name: "Donnie Darko"; obj : {field1: "field"; field2: "field2"} phone: "666-6666";");
if(objPatternMatcher.find()){
System.out.println(objPatternMatcher.group(1));
}
Комментарии:
1. одна вещь, которую я должен упомянуть, это то, что физически невозможно использовать регулярное выражение для обхода вложенной иерархии. Если в ‘obj’ есть какие-либо вложенные объекты JSON, это не сработает. Вы могли бы изменить регулярное выражение, чтобы справиться с этим, но вам нужно будет делать это для каждого уровня ниже.
Ответ №2:
Вы думали об использовании ANTLR? Это средство распознавания языка, которое намного мощнее регулярного выражения. Таким образом, вы могли бы иметь дело с составными полями (например, {field1: {field3:"field3"; field4="field4"}; field2: "field2"}
), хотя кривая обучения круче, чем при изучении регулярных выражений; но, на мой взгляд, изучение ANTLR того стоит.
Комментарии:
1. Если вам действительно нужно выполнить правильную интерпретацию, antlr определенно подойдет.
Ответ №3:
выглядит как строка JSON… вы можете использовать JSON 🙂
Комментарии:
1. На самом деле это близко, но недостаточно близко. Это скорее список, чем карта, и если бы я попытался разобрать это как JSON, это взорвалось бы.
2. @stevebot Несколько простых замен строк могут привести вас к правильному json.
3. эти замены строк были бы достаточно сложными, так что я мог бы просто использовать регулярное выражение для получения данных.