Ricky Hartmann
Ricky Hartmann

Reputation: 901

Parse string regex for known keys but leave separator

Ok, So I hit a little bit of a snag trying to make a regex.

Essentially, I want a string like:

error=some=new item user=max dateFrom=2013-01-15T05:00:00.000Z dateTo=2013-01-16T05:00:00.000Z

to be parsed to read

error=some=new item
user=max
dateFrom=2013-01-15T05:00:00.000Z
ateTo=2013-01-16T05:00:00.000Z

So I want it to pull known keywords, and ignore other strings that have =.

My current regex looks like this:

(error|user|dateFrom|dateTo|timeFrom|timeTo|hang)\=[\w\s\f\-\:]+(?![(error|user|dateFrom|dateTo|timeFrom|timeTo|hang)\=])

So I'm using known keywords to be used dynamically so I can list them as being know.

How could I write it to include this requirement?

Upvotes: 2

Views: 154

Answers (2)

nhahtdh
nhahtdh

Reputation: 56819

Another way to tokenize the string:

var tokens = inputString.split(/ (?=[^= ]+=)/);

The regex looks for space that is succeeded by (a non-space-non-equal-sign sequence that ends with a =), and split at those spaces.

Result:

["error=some=new item", "user=max", "dateFrom=2013-01-15T05:00:00.000Z", "dateTo=2013-01-16T05:00:00.000Z"]

Using the technique above and adapt your regex from your question:

var tokens = inputString.split(/(?=\b(?:error|user|dateFrom|dateTo|timeFrom|timeTo|hang)=)/);

This will correctly split the input pointed out by Qtax mentioned in the comment: "error=user=max foo=bar"

["error=", "user=max foo=bar"]

Upvotes: 1

Qtax
Qtax

Reputation: 33918

You could use a replace like so:

var input = "error=some=new item user=max dateFrom=2013-01-15T05:00:00.000Z dateTo=2013-01-16T05:00:00.000Z";

var result = input.replace(/\s*\b((?:error|user|dateFrom|dateTo|timeFrom|timeTo|hang)=)/g, "\n$1");
result = result.replace(/^\r?\n/, ""); // remove the first line

Result:

error=some=new item 
user=max 
dateFrom=2013-01-15T05:00:00.000Z 
dateTo=2013-01-16T05:00:00.000Z

Upvotes: 2

Related Questions