2010-12-28 2 views
0

В системе, в которой я работаю, есть некоторый старый код, который я бы хотел изменить, но не могу. Этот код хранит значения в карте, которая выглядит как следующую строку:Как разбить строку карты с помощью Regex в Java

userId: "929290"; name: "Donnie Darko"; obj : {field1: "field"; field2: "field2"} phone: "666-6666"; 

Обратите внимание, что карта объекта не следует точка с запятой, но любой другой пары ключ/значение. Есть ли способ использовать Regex в 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, это не сработает. Вы можете изменить регулярное выражение, чтобы справиться с этим, но вам нужно сделать это для каждого уровня вниз. –

0

выглядит как строка JSON ... Вы можете использовать JSON :)

+0

Это на самом деле близко, но недостаточно близко. Это скорее список, чем карта, и если я попытаюсь разобрать это как JSON, он взорвется. – stevebot

+1

@stevebot Несколько простых заменой строк могут привести к действию json. – marcog

+0

эти замены строк были бы достаточно сложными, так что я мог бы просто использовать Regex для получения данных. – stevebot

1

Вы думали использования ANTLR? Это распознаватель языка, который намного мощнее, чем регулярное выражение. Таким образом, вы можете иметь дело с составными полями (например, {field1: {field3:"field3"; field4="field4"}; field2: "field2"}). Кривая обучения более крутая, чем у обучающих регулярных выражений; но, на мой взгляд, изучение ANTLR того стоит.

+1

Если вам действительно нужно сделать правильную интерпретацию, antlr определенно подходит. –

Смежные вопросы