Всем привет!
Столкнулся с задачей, но никак не могу понять как ее сделать.
В общем, есть формат Tree(Описание Формата)
Вкратце - это строка, в которой есть символы \n, \t, пробелы и т.д
Т.е вида
"access\n\ttime =2014-10-10\n\turl =labuda.com\n\tip =8.8.8.8\nerror\n\tunknown\n\t\terror =fuck"
В человеческом представлении будет:
access
time =2014-10-10
url =labuda.com
ip =8.8.8.8
error
unknown
error =fuck
Я хочу ее научиться парсить, т.е на выходе получать что-то типа:
[Node(access, [Node(time, 2014-10-10), Node(url, labuda.com), Node(ip, 8.8.8.8)]), Node(error, [Node(unknown, [Node(error, fuck)])])]
Пока что я дошел до того, что могу получить все Node:
class Node
{
String name;
String content;
Node [] chlrn;
int indent;
Node()
{
this.name = null;
this.content = null;
this.indent = 0;
}
Node(String values,String name, int indent)
{
this.name = name;
this.content = values;
this.indent = indent;
}
void printNode()
{
System.out.println("Name: " + name + ", Value: " + content + ", Indent: " + indent);
}
}
public class Main {
public static void main(String[] args)
{
//Example string
String str = "access\n\ttime =2014-10-10\n\turl =labuda.com\n\tip =8.8.8.8\nerror\n\tunknown\n\t\terror =fuck";
String [] strArr = str.split("\n");
Pattern p = Pattern.compile("^([ \\t]*)([^=]*)(?:=(.*))?$");
Matcher m;
List<Node> lstNode = new ArrayList<Node>();
List<Node> lstNodeAns = new ArrayList<Node>();
for(int i = 0; i < strArr.length; i++)
{
//System.out.println(i + " " + strArr[i]);
String line = strArr[i];
m = p.matcher(line);
if (!m.find())
continue;
String indent = m.group(1); // отступы
String key = m.group(2); // узел
String value = m.group(3); //значение
//System.out.println(indent + key + value);
//System.out.println(indent.length());
Node nde = new Node(value, key, indent.length());
lstNode.add(nde);
}
}
Name: access , Value: null, Indent: 0
Name: time , Value: 2014-10-10, Indent: 1
Name: url , Value: labuda.com, Indent: 1
Name: ip , Value: 8.8.8.8, Indent: 1
Name: error, Value: null, Indent: 0
Name: unknown, Value: null, Indent: 1
Name: error , Value: fuck, Indent: 2
Где indent - это отступ(по которому и надо определять вложенность, как мне кажется).
key - это узел, а value - его значение.
Т.е я распарсил и получил все узлы дерева, но как реализовать правильную вложенность(принадлежность) узла к узлу?
Буду очень благодарен за помощь!