Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Split a string, at every nth position

I use this regex to split a string at every say 3rd position:

String []thisCombo2 = thisCombo.split("(?<=\\G...)"); 

where the 3 dots after the G indicates every nth position to split. In this case, the 3 dots indicate every 3 positions. An example:

Input: String st = "123124125134135145234235245" Output: 123 124 125 134 135 145 234 235 245. 

My question is, how do i let the user control the number of positions where the string must be split at? In other words, how do I make those 3 dots, n dots controlled by the user?

like image 653
Emile Beukes Avatar asked Sep 06 '12 08:09

Emile Beukes


People also ask

How do I split a string into multiple places?

To split a string by multiple spaces, call the split() method, passing it a regular expression, e.g. str. trim(). split(/\s+/) . The regular expression will split the string on one or more spaces and return an array containing the substrings.

How do you split a string into chunks in Python?

Python split() method is used to split the string into chunks, and it accepts one argument called separator. A separator can be any character or a symbol. If no separators are defined, then it will split the given string and whitespace will be used by default.

How do you split a string after a specific number of characters in Python?

Use range() function and slicing notation to split string by a number of characters in Python.


2 Answers

For a big performance improvement, an alternative would be to use substring() in a loop:

public String[] splitStringEvery(String s, int interval) {     int arrayLength = (int) Math.ceil(((s.length() / (double)interval)));     String[] result = new String[arrayLength];      int j = 0;     int lastIndex = result.length - 1;     for (int i = 0; i < lastIndex; i++) {         result[i] = s.substring(j, j + interval);         j += interval;     } //Add the last bit     result[lastIndex] = s.substring(j);      return result; } 

Example:

Input:  String st = "1231241251341351452342352456" Output: 123 124 125 134 135 145 234 235 245 6. 

It's not as short as stevevls' solution, but it's way more efficient (see below) and I think it would be easier to adjust in the future, of course depending on your situation.


Performance tests (Java 7u45)

2,000 characters long string - interval is 3.

split("(?<=\\G.{" + count + "})") performance (in miliseconds):

7, 7, 5, 5, 4, 3, 3, 2, 2, 2 

splitStringEvery() (substring()) performance (in miliseconds):

2, 0, 0, 0, 0, 1, 0, 1, 0, 0 

2,000,000 characters long string - interval is 3.

split() performance (in miliseconds):

207, 95, 376, 87, 97, 83, 83, 82, 81, 83 

splitStringEvery() performance (in miliseconds):

44, 20, 13, 24, 13, 26, 12, 38, 12, 13 

2,000,000 characters long string - interval is 30.

split() performance (in miliseconds):

103, 61, 41, 55, 43, 44, 49, 47, 47, 45 

splitStringEvery() performance (in miliseconds):

7, 7, 2, 5, 1, 3, 4, 4, 2, 1 

Conclusion:

The splitStringEvery() method is a lot faster (even after the changes in Java 7u6), and it escalates when the intervals become higher.

Ready-to-use Test Code:

pastebin.com/QMPgLbG9

like image 114
Aske B. Avatar answered Sep 23 '22 02:09

Aske B.


You can use the brace operator to specify the number of times a character must occur:

String []thisCombo2 = thisCombo.split("(?<=\\G.{" + count + "})"); 

The brace is a handy tool because you can use it to specify either an exact count or ranges.

like image 24
stevevls Avatar answered Sep 22 '22 02:09

stevevls