views:

138

answers:

6

Hi

below is something I am trying to do with JavaScript.

If I have string like

str = "how are you? hope you are doing good" ;

now I want to split it with ? (or . or !) but I dont want to lose the "?". Instead I want to break the string just after the question mark such a way that question mark is with the first segment that we have. also after the ? or / or ! there needs to be a \s (space) in order to break it into segments

after splitting str what should I get is

["how are you?","hope you are doing good"]

I am not sure if it can be done with Javascript split() function ,please help.

+1  A: 

...

var str = "how are you? hope you are doing good";
var data = str.split('?');
data[0] += '?';

alert(data[0]); // result: how are you?
alert(data[1]); // result: hope you are doing good
Sarfraz
+4  A: 

The easiest, most straight-forward way I can see is to just lose the "?" and add it back:

var parts, n;
parts = str.split("?");
for (n = parts.length - 2; n >= 0; --n) { // Skip the last one
    parts[n] += "?";
}
if (str.charAt(str.length-1) == "?") {    // If it ended with "?", add it back
    parts[parts.length-1] += "?";
}

Alternately, though, there's a way via RegExp. Edit Removed mine, S.Mark's regex is so much better.

T.J. Crowder
+10  A: 
str.match(/\S[^?]*(?:\?+|$)/g)

["how are you?", "hope you are doing good"]
S.Mark
Just curious, is there a reason you chose to use `\S[^?]*` over `[^?]+`?
Kevin
just to strip leading whitespaces, @Kevin.
S.Mark
Ahh okay, makes sense. Initially read it wrong. Maybe it's time for bed. Anyway, this is definitely the way to do it. Green check mark here!
Kevin
Nice and simple! But fails with two "?" in a row, e.g. `"how are you?? hope you are doing good"` => `["how are you?", "? hope you are doing good"]` If you drop the whitespace thing (`\S`), that problem goes away (and you can just clean it after).
T.J. Crowder
@T.J. Crowder, updated `\?` to `\?+` to support that `??` pattern, If I drop `\S` it would return 2nd one as `" hope you are doing good"`
S.Mark
@S.Mark: Excellent answer.
T.J. Crowder
+1  A: 

If JS supported regexp look-behinds all you'd need is split by /(?<=\?)/, but unfortunately it doesn't. However you can very easily get the same behavior with the match() function:

var str = "how are you? hope you are doing good";
var data = str.match(/(?!$)[^?]*\??/g);

Will give you ["how are you?", " hope you are doing good"]

reko_t
Sourabh
+2  A: 

One option is to use a regex, as in:

str = "how are you? hope you are doing good";
var tokens = str.split(/(\?)/)

but this wil result in the question marks in their own token: how are you,?, hope you are,?, doing good

A better option is:

var tokens = str.match(/[^?]+\?*/g)

This will also keep multiple question marks: "hello??? how are you?"

Kobi
+1  A: 

another idea:

var str = "how are you? hope you are doing good",
    strsplit = str.split('?').join('?#').split('#');
alert(strsplit) //=> how are you?, hope you are doing good

or (based on answer & comment from kobi)

var str = "how are you? All right?? Hope so???";
alert(str.replace(/([\?(1,}][^\?$])/g,'$1#!#').split(' #!#'));
  //=>how are you?,All right??,Hope so???
KooiInc
might as well `replace(/\?/g, '?###')`, but you're taking a risk if the string already has # signs.
Kobi