J'ai un texte très long qui ressemble à "123testes1233iambeginnerplshelp123 .." et je dois séparer la ligne avec le paragraphe chaque fois que le programme lit le nombre. La sortie devrait donc être comme:
123tests
12333iambeninnerplshelp
123 ...
4 Réponses :
Une façon de le faire serait d'utiliser StringTokenizer . Si vous supposez que chaque ligne de sortie doit commencer par 123 , même si l'entrée ne commence pas par elle, cela pourrait être:
String input = "123testes1233iambeginnerplshelp123 ..";
String delimiter = "123";
StringTokenizer tokenizer = new StringTokenizer(input, delimiter);
while (tokenizer.hasMoreTokens()) {
String line = delimiter + tokenizer.nextToken();
System.out.println(line);
}
Je pense que l'OP veut n'importe quel nombre, pas un délimiteur statique. Existe-t-il une solution en streaming qui fournit un type de délégué (Predicate) en tant qu'argument au lieu de la const String qui est similaire à StringTokenizer?
@PaulNikonowicz S'il s'agissait d'un nombre quelconque, la chaîne serait 1, 2, 3tests, etc. au lieu de 123tests
@PaulNikonowicz vous avez raison. Désolé de ne pas le mentionner
Vous pouvez le résoudre en utilisant Regex. Chaque fois que nous recherchons des modèles où le nombre est suivi de caractères et s'il est trouvé, imprimez-le:
String text = "123testes1233stackoverflowwillsaveyou123dontworry";
String wordToFind = "\\d+[a-z]+";
Pattern word = Pattern.compile(wordToFind);
Matcher match = word.matcher(text);
while (match.find()) {
System.out.println(match.group());
}
Pourquoi utilisez-vous start () et end () ? Cela ne suffit pas: while (match.find ()) {System.out.println (match.group ()); } ?
Une approche simple (sans aucune dépendance) ressemblerait à quelque chose comme ceci,
class Test {
public static void main (String[] args) throws java.lang.Exception
{
String a = "123testes1233iambeginnerplshelp123";
StringBuffer sb = new StringBuffer();
for (int i=0; i<a.length()-1; i++) {
while (i<a.length()-1 && !(!isNumber(a.charAt(i)) && isNumber(a.charAt(i+1)))) {
sb.append(a.substring(i,i+1));
i++;
}
sb.append(a.substring(i,i+1));
System.out.println(sb.toString());
sb.setLength(0);
}
}
private static boolean isNumber (char c) {
return ((int)c >=48) && ((int)c <= 57);
}
}
C'est vraiment comme ça que vous devriez le faire. Ma seule recommandation est d'ajouter '\ n' au lieu d'imprimer chaque ligne et de définir la longueur sur 0. Ensuite, vous pouvez faire un gros caractères par la suite. Vous devez également utiliser StringBuilder sur StringBuffer.
ma solution
public StringSplitNum(){
String someString = "123testes1233iambeginnerplshelp123abc";
String regex = "((?<=[a-zA-Z])(?=[0-9]))|((?<=[0-9])(?=[a-zA-Z]))";
List arr = Arrays.asList(someString.split(regex));
for(int i=0; i< arr.size();i+=2){
System.out.println(arr.get(i)+ " " + arr.get(i+1));
}
Bienvenue. vous devriez compléter votre question avec "... et j'ai essayé de faire ..." afin que les gens ici puissent vous guider davantage dans la bonne direction.