1

I'm a little lost when it comes to more advanced or lengthy Regex to be honest. I have a query string that I need to match and get the values and the name of query params. The difficulty for me is that the value can be different values and there are, currently, only 4 different query params. Here is an example query string:

foo title:"Foo Bar" -title:other author: (mitchell* OR mike) from:2012-01-01 to: 2012-06-01

The query params are title, author, from and to. The three different values are within double-quotes "Foo Bar", surrounded with parenthesis (mitchell* OR mike) or a single value 2012-01-01 or other. Notice there is an optional space after the colon also. There also could be a + or - before each param name, -title. The title and author values can have the wildcard.

I'm currently not interested in parsing the value like I don't need to parse (mitchell* or mike) to know what's in it, just want to display it as a whole.

How can I, with Regex, parse this string to get the value to the param name that goes along with it?

I can deal with result like:

['title:"Foo Bar"', '-title:other', 'author: (mitchell* OR mike)', 'from:2012-01-01', 'to:2012-06-01']

I do not need to worry about the value that doesn't have a param name like the foo at the beginning (which could be anywhere in the string), just need to get the param name and value.

1
  • I can do whatever I need to do to accomplish what I need. If that means parsing something first and then doing something that's fine. Never said it was a request string, I used the terms that could make you think it was like params but it's a string that gets fed into a search server but I want to parse this "query string" for the UI. Commented Aug 6, 2012 at 16:31

2 Answers 2

1

Joseph is right. The data you're giving is very messy, to make it in one regex would be too complicated, IMO, the best way I could think of this is applying 3 different expressions, one for each type you want to search for:

This searches for items starting with left bracket:

-?\w+:\s*\((.*?)\)

This searches for items starting with double quotes:

-?\w+:\s*"(.*?)"

This searches for other items (items with spaces won't work):

-?\w+:\s*([^\s"\(]+)

Probably, there is an easier way of doing it, but this is the way I would do it.

Sign up to request clarification or add additional context in comments.

3 Comments

I have full control and don't mind doing it in multiple if that's the only way. I wouldn't really say it's messy, it's flexible but like the saying goes, you say tomato, I say tomato (looses context just typing)
These work except if there are multiple matches in each regex. For instance if I add '-title:test' in there, the 3rd one should technically match both -title:other and -title:test but it returns only the first. Once we get that going then you have answered this perfectly!
Nevermind, revisited and added g for global and it matched it all. Thanks!
0

This regexp does what I was wanting:

/-?\w+:\s*([^\s"\(]+|"(.*?)"|\((.*?)\))/g

Returns:

["title:"Foo Bar"", "-title:other", "author: (mitchell* OR mike)", "from:2012-01-01", "to: 2012-06-01"]

as am wanting!

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.