2015-12-22 1 views
2

J'écris un programme où je dois lire un fichier texte et extraire quelques chaînes spécifiques, le texte est écrit dans un langage DOT et ceci est un exemple du fichier:Extraction des informations à partir du fichier texte en java

digraph G { 
node [shape=circle]; 
0 [xlabel="[]"]; 
1 [xlabel="[[Text]]"]; 
0 -> 1 [label="a"];//this 
1 -> 2 [label="ab"];//this 
1 -> 3 [label="123"];//this 
} 

Je veux ignorer tout sauf les lignes qui ont la structure des lignes commentées (par //this);

ensuite divisé chaque ligne à trois parties, à savoir:

1 -> 2 [label="ab"]; 

enregistré en tant que liste de chaînes (ou un tableau ...):

[1,2,ab] 

J'ai essayé beaucoup avec regex mais je n'a pas pu obtenir les résultats attendus.

+0

Essayez [ '^ (\ d +) \ s + -> \ s + (\ d +) \ s + \ [\ w + = "([^"] *) "]; \ s * // [^/\ n] * $'] (https://regex101.com/r/mB4tY2/1). sont dans le groupe 1, 2 et 3. –

+0

puisque vous êtes en train d'analyser un fichier point (fichier graphique), il existe peut-être une bibliothèque java qui peut analyser les fichiers point et obtenir les informations dont vous avez besoin (nœuds, bords, étiquettes). solution plus robuste que regex – svenhornberg

+0

merci pour tout le monde!, @stribizhev pouvez-vous le mettre en code s'il vous plaît !! –

Répondre

1

Voici le regex vous pouvez utiliser:

(?m)^(\d+)\s+->\s+(\d+)\s+\[\w+="([^"]*)"];\s*//[^/\n]*$ 

Voir regex demo.

Tous les détails nécessaires sont détenus dans le groupe 1, 2 et 3.

Voir Java code:

String str = "digraph G {\nnode [shape=circle];\n0 [xlabel=\"[]\"];\n1 [xlabel=\"[[Text]]\"];\n0 -> 1 [label=\"a\"];//this\n1 -> 2 [label=\"ab\"];//this\n1 -> 3 [label=\"123\"];//this\n}"; 
Pattern ptrn = Pattern.compile("(?m)^(\\d+)\\s+->\\s+(\\d+)\\s+\\[\\w+=\"([^\"]*)\"\\];\\s*//[^/\n]*$"); 
Matcher m = ptrn.matcher(str); 
ArrayList<String[]> results = new ArrayList<String[]>(); 
while (m.find()) { 
    results.add(new String[]{m.group(1), m.group(2), m.group(3)}); 
} 
for(int i = 0; i < results.size(); i++) {    // Display results 
    System.out.println(Arrays.toString(results.get(i))); 
} 
+0

ça marche, merci VERYMUCH @stribizhev !!!!! –

1

SI vous êtes assuré que la ligne sera toujours dans le format de a -> b [label="someLabel"]; alors je suppose que vous pouvez utiliser un tas de grand écart pour obtenir ce dont vous avez besoin:

if (outputLine.contains("[label=")) { 
    String[] split1 = outputLine.split("->"); 
    String first = split1[0].replace(" ", ""); // value of 1 
    String[] split2 = split1[1].split("\\[label=\""); 
    String second = split2[0].replace(" ", ""); // value of 2 
    String label = split2[1].replace("\"", "").replace(" ", "").replace("]", "").replace(";", ""); // just the label 
    String[] finalArray = {first, second, label};   
    System.out.println(Arrays.toString(finalArray)); // [1, 2, ab] 
} 

Semble maladroits. Probablement une meilleure façon de le faire.

+0

merci @blahfunk, pouvez-vous ajouter quelque chose sur ignorer les autres lignes. –

+0

Mise à jour avec une expression conditionnelle. –

+0

merci beaucoup @blahfunk pour votre aide, bonne idée !!! aide beaucoup :) –