Quelqu'un peut-il suggérer une méthode pour écrire une chaîne de caractères de plusieurs lignes sur une console système et faire en sorte que ce bloc de texte soit indenté ? Je recherche quelque chose de relativement léger, car cette méthode ne sert qu'à afficher l'aide d'un programme en ligne de commande.
Réponses
Trop de publicités?NOTE : L'approche décrite ci-dessous ne répond pas aux exigences actualisées décrites par @BillMan dans les commentaires de la question. Ce site ne sera pas enrouler automatiquement les lignes qui sont plus longues que la longueur de ligne de la console - n'utilisez cette approche que si l'enroulement n'est pas un problème.
En guise d'option simple, vous pouvez utiliser String.replaceAll()
comme suit :
String output = <your string here>
String indented = output.replaceAll("(?m)^", "\t");
Si vous n'êtes pas familier avec les expressions régulières Java, cela fonctionne comme suit :
-
(?m)
active le mode multiligne. Cela signifie que chaque ligne deoutput
est considéré individuellement, au lieu de traiteroutput
sur une seule ligne (ce qui est le cas par défaut). -
^
est une expression rationnelle correspondant au début de chaque ligne. -
\t
fait en sorte que chaque correspondance de la regex précédente (c'est-à-dire le début de chaque ligne) soit remplacée par un caractère de tabulation.
A titre d'exemple, le code suivant :
String output = "foo\nbar\nbaz\n"
String indented = output.replaceAll("(?m)^", "\t");
System.out.println(indented);
Produit cette sortie :
foo
bar
baz
Avec JDK/12 en accès anticipé on peut maintenant utiliser le indent
API de la classe String qui est actuellement disponible sous la fonction de prévisualisation et peut être utilisée comme :
String indentedBody =
`<html>
<body>
<p>Hello World - Indented.</p>
</body>
</html>`.indent(4);
et la sortie du code ci-dessus serait
<html> <body> <p>Hello World - Indented.</p> </body> </html>
La spécification documentée actuelle de l'API supplémentaire est la suivante :
/**
* Adjusts the indentation of each line of this string based on the value of
* {@code n}, and normalizes line termination characters.
* <p>
* This string is conceptually separated into lines using
* {@link String#lines()}. Each line is then adjusted as described below
* and then suffixed with a line feed {@code "\n"} (U+000A). The resulting
* lines are then concatenated and returned.
* <p>
* If {@code n > 0} then {@code n} spaces (U+0020) are inserted at the
* beginning of each line. {@link String#isBlank() Blank lines} are
* unaffected.
* <p>
* If {@code n < 0} then up to {@code n}
* {@link Character#isWhitespace(int) white space characters} are removed
* from the beginning of each line. If a given line does not contain
* sufficient white space then all leading
* {@link Character#isWhitespace(int) white space characters} are removed.
* Each white space character is treated as a single character. In
* particular, the tab character {@code "\t"} (U+0009) is considered a
* single character; it is not expanded.
* <p>
* If {@code n == 0} then the line remains unchanged. However, line
* terminators are still normalized.
* <p>
*
* @param n number of leading
* {@link Character#isWhitespace(int) white space characters}
* to add or remove
*
* @return string with indentation adjusted and line endings normalized
*
* @see String#lines()
* @see String#isBlank()
* @see Character#isWhitespace(int)
*
* @since 12
*/
public String indent(int n)