Как разделить строку карты с помощью регулярного выражения в Java

#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. эти замены строк были бы достаточно сложными, так что я мог бы просто использовать регулярное выражение для получения данных.