7

I've been looking through pages and pages of Google results but haven't come across anything that could help me.

What I'm trying to do is split a string like Bananas22Apples496Pears3, and break it down into some kind of readable format. Since String.split() cannot do this, I was wondering if anyone could point me to a regex snippet that could accomplish this.

Expanding a bit: the above string would be split into (String[] for simplicity's sake):

{"Bananas:22", "Apples:496", "Pears:3"}
Timr
  • 1,012
  • 1
  • 14
  • 29

5 Answers5

4

Try this

String s = "Bananas22Apples496Pears3";

String[] res = s.replaceAll("(?<=\\p{L})(?=\\d)", ":").split("(?<=\\d)(?=\\p{L})");
    for (String t : res) {
        System.out.println(t);
    }

The first step would be to replace the empty string with a ":", when on the left is a letter with the lookbehind assertion (?<=\\p{L}) and on the right is a digit, with the lookahead assertion (?=\\d).

Then split the result, when on the left is a digit and on the right is a letter.

\\p{L} is a Unicode property that matches every letter in every language.

stema
  • 90,351
  • 20
  • 107
  • 135
3

You need to Replace and then split the string.You can't do it with the split alone

1> Replace All the string with the following regex

(\\w+?)(\\d+)

and replace it with

$1:$2

2> Now Split it with this regex

(?<=\\d)(?=[a-zA-Z])
Anirudha
  • 32,393
  • 7
  • 68
  • 89
1

This should do what you want:

import java.util.regex.*;

String d = "Bananas22Apples496Pears3"

Pattern p = Pattern.compile("[A-Za-z]+|[0-9]+");

Matcher m = p.matcher(d);

while (m.find()) {
      System.out.println(m.group());
}

// Bananas
// 22
// Apples
// 496
// Pears
// 3
Chris Snow
  • 23,813
  • 35
  • 144
  • 309
0

Replace \d+ by :$0 and then split at (?=[a-zA-Z]+:\d+).

Joey
  • 344,408
  • 85
  • 689
  • 683
0
String myText = "Bananas22Apples496Pears3";
System.out.println(myText.replaceAll("([A-Za-z]+)([0-9]+)", "$1:$2,"));
prageeth
  • 7,159
  • 7
  • 44
  • 72