How can I split this string in JavaScript?

I have strings like this:

ab
rx'
wq''
pok'''
oyu,
mi,,,,

Basically, I want to split the string into two parts. The first part should have the alphabetical characters intact, the second part should have the non-alphabetical characters. The alphabetical part is guaranteed to be 2-3 lowercase characters between a and z; the non-alphabetical part can be any length, and is gauranteed to only be the characters , or ', but not both in the one string (e.g. eex,', will never occur).

So the result should be:

[ab][]
[rx][']
[wq]['']
[pok][''']
[oyu][,]
[mi][,,,,]

How can I do this? I'm guessing a regular expression but I'm not particularly adept at coming up with them.

Upvotes: 0

Views: 175

Answers (6)

user123444555621
user123444555621

Reputation: 152986

Regular expressions have is a nice special called "word boundary" (\b). You can use it, well, to detect the boundary of a word, which is a sequence of alpha-numerical characters.

So all you have to do is

foo.split(/\b/)

For example,

"pok'''".split(/\b/) // ["pok", "'''"]

Upvotes: 2

phaistonian
phaistonian

Reputation: 94

if (match = string.match(/^([a-z]{2,3})(,+?$|'+?$)/)) {
    match = match.slice(1);
}

Upvotes: 0

LetterEh
LetterEh

Reputation: 26696

If you can 100% guarantee that:

  1. Letter-strings are 2 or 3 characters
  2. There are always one or more primes/commas
  3. There is never any empty space before, after or in-between the letters and the marks
    (aside from line-break)

You can use:

/^([a-zA-Z]{2,3})('+|,+)$/gm

var arr = /^([a-zA-Z]{2,3})('+|,+)$/gm.exec("pok'''");
arr === ["pok'''", "pok", "'''"];

var arr = /^([a-zA-Z]{2,3})('+|,+)$/gm.exec("baf,,,");
arr === ["baf,,,", "baf", ",,,"];

Of course, save yourself some sanity, and save that RegEx as a var.

And as a warning, if you haven't dealt with RegEx like this: If a match isn't found -- if you try to match foo','' by mixing marks, or you have 0-1 or 4+ letters, or 0 marks... ...then instead of getting an array back, you'll get null.

So you can do this:

var reg = /^([a-zA-Z]{2,3})('+|,+)$/gm,
    string = "foobar'',,''",

    result_array = reg.exec(string) || [string];

In this case, the result of the exec is null; by putting the || (or) there, we can return an array that has the original string in it, as index-0.

Why?

Because the result of a successful exec will have 3 slots; [*string*, *letters*, *marks*]. You might be tempted to just read the letters like result_array[1]. But if the match failed and result_array === null, then JavaScript will scream at you for trying null[1].

So returning the array at the end of a failed exec will allow you to get result_array[1] === undefined (ie: there was no match to the pattern, so there are no letters in index-1), rather than a JS error.

Upvotes: 2

Nicholas Albion
Nicholas Albion

Reputation: 3284

yourStr.match(/(\w{2,3})([,']*)/)

Upvotes: 0

nbaztec
nbaztec

Reputation: 402

var str = "mi,,,,";
var idx = str.search(/\W/);
if(idx) {
    var list = [str.slice(0, idx), str.slice(idx)]
}

You'll have the parts in list[0] and list[1].

P.S. There might be some better ways than this.

Upvotes: 0

Nuxy
Nuxy

Reputation: 384

You could try something like that:

function splitString(string){
   var match1 = null;
   var match2 = null;
   var stringArray = new Array();
   match1 = string.indexOf(',');
   match2 = string.indexOf('`');
   if(match1 != 0){
      stringArray = [string.slice(0,match1-1),string.slice(match1,string.length-1];
   }
   else if(match2 != 0){
      stringArray = [string.slice(0,match2-1),string.slice(match2,string.length-1];
   }
   else{
      stringArray = [string];
   }

}

Upvotes: 0

Related Questions