Comment dois-je analyser la chaîne code> code> à l'aide de Java pour extraire le chemin de fichier?
exemple: p> ? code> signifie n'importe quel nombre de charaters aléatoires P>
_ code> signifie n'importe quel nombre d'espaces blancs (sans nouvelle ligne) p>
foo / bar / baz.xml code> p> p>
5 Réponses :
Java.Util.regex est votre ami. P>
Certaines personnes, lorsqu'elles sont confrontées à une question de dépassement de pile, répondez "java.util.regex est votre ami" maintenant la personne qui demande la question a deux problèmes. (Libéralement paraphrasé de blogs.msdn.com/oldnewthing/archive/ 2006/03/22 / 558007.aspx ) - Si vous suggérez d'utiliser des expressions régulières, donnez un exemple.
@Gant Wagner je ne vois rien de mal à pointer des personnes dans la bonne direction, même si je n'ai pas le temps de travailler une solution complète. Si vous n'êtes pas satisfait de la réponse, donnez-lui un meilleur au lieu de perdre votre temps à me plaindre.
String regex = ".*\\[LoadFile\\]\\s+file\\s+=\\s+\"([^\"].+)\".*"; Matcher m = Pattern.compile(regex).matcher(inputString); if (!m.find()) System.out.println("No match found."); else String result = m.group(1); The String in result should be your file path. (assuming I didn't make any mistakes)You should take a look at the Pattern class for some regular expression help. They can be a very powerful string manipulation tool.
". * \ [Loaderfile \] \\ s fichier \\ s * = \\ s i> \" ([^ \\\ "]. *) \". * "Serait mieux à faire correspondre n'importe quel nombre d'espaces blancs
". * \" ([^ \\\ "]. *) \". * "serait encore mieux que nous ne nous soucions pas du format de préfixe (connu par défaut) et qu'il ne contient aucun devis.
FYI, la regex de Jean correspondrait à aucun espace blanc aussi, ex. [CHARGEFILE] File = "FOO / BAR / BAZ.XML". Donc, si vous voulez au moins un caractère d'espace blanc, utilisez + au lieu de * comme Jinguy spécifié à l'origine.
@weenaak: J'aurais lu "n'importe quel nombre d'espaces blancs" comme signifiant n'importe quel nombre, y compris zéro.
Deux corrections: la méthode qui crée l'objet correspondant est .matcher (INTRISTRING) code> (non capitalisé), et vous devez Appliquer i> la regex en appelant
.matches ( ) code> ou
.Find () code> sur le correspondeur.
Vous pouvez rendre l'expression régulière un peu plus courte que celle de Jinguy. Fondamentalement, le RHS sans le "s.
Je pense que Jinguy supposait que le chemin ne devrait être extrait que si la ligne a [CHARGEFILE] dedans ...
Lorsque j'écris une regex, j'essaie d'être aussi précis que possible.
tandis que les expressions régulières sont bien et toutes, vous pouvez également utiliser la classe java.util.stringtenizerzer code> pour faire le travail. L'avantage est un code plus respectueux des personnes humaines.
StringTokenizer tokenizer = new StringTokenizer(inputString, "\"");
tokenizer.nextElement();
String path = tokenizer.nextElement();
Un autre avantage de StringTokenizer est qu'il sera probablement plus efficace ... à condition qu'il soit capable de faire le travail à portée de main.
C'est juste que s'il s'agit d'un certain nombre de "caractères dans le premier ensemble de caractères aléatoires, le Tokenizer reviendra volontiers que comme l'élément suivant. Cependant, l'exemple suggère la première partie de la ligne d'entrée est juste une horodatage. Une regex est plus difficile à écrire, mais beaucoup plus capable de gérer une entrée extrêmement différente.
Je conviens qu'un StringTokenizer n'est pas une solution idéale à chaque problème d'analyse, mais dans ce cas, il me semble vraiment que l'utilisation d'une regex est un peu comme la chasse à des mouches avec un canon ...
Réponse courte: Utilisez Sollection () EM>. if (line.contains("[LoadFile]")) {
String[] values = line.split("\"");
result = values[1];
}