Timr
Timr

Reputation: 1032

Java (Regex?) split string between number/letter combination

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"}

Upvotes: 7

Views: 6776

Answers (5)

Anirudha
Anirudha

Reputation: 32797

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])

Upvotes: 3

Joey
Joey

Reputation: 354556

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

Upvotes: 0

prageeth
prageeth

Reputation: 7395

String myText = "Bananas22Apples496Pears3";
System.out.println(myText.replaceAll("([A-Za-z]+)([0-9]+)", "$1:$2,"));

Upvotes: 0

stema
stema

Reputation: 92986

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.

Upvotes: 4

Chris Snow
Chris Snow

Reputation: 24606

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

Upvotes: 1

Related Questions