I'm doing some basic text matching from an input. I need the ability to perform a basic "AND". For "ANY" I split the input by spaces and join each word by the pipe ("|") character but I haven't found a way to tell the regular expression to match any of the words.
switch (searchOption) {
case "any":
inputArray = input.split(" ");
if (inputArray.length > 1) { input = inputArray.join("|"); }
text = input;
break;
case "all":
inputArray = input.split(" ");
***[WHAT TO DO HERE?]***
text = input;
break;
case "exact":
inputArray = new Array(input);
text = input;
break;
}
Seems like it should be easy.
Use lookahead. Try this:
if( inputArray.length>1 ) rgx = "(?=.*" + inputArray.join( ")(?=.*" ) + ").*";
You'll end up with something like
(?=.*dog)(?=.*cat)(?=.*mouse).*
Which should only match if all the words appear, but they can be in any order.
But not
The way it works is that the regex engine scans from the current match point (0) looking for .*dog
, the first sub-regex (any number of any character, followed by dog). When it determines true-ness of that regex, it resets the match point (back to 0) and continues with the next sub-regex. So, the net is that it doesn't matter where each word is; only that every word is found.
EDIT: @Justin pointed out that i should have a trailing .*
, which i've added above. Without it, text.match(regex)
works, but regex.exec(text)
returns an empty match string. With the trailing .*
, you get the matching string.
The problem with "and" is: in what combination do you want the words? Can they appear in any order, or must they be in the order given? Can they appear consecutively or can there be other words in between?
These decisions impact heavily what search (or searches) you do.
If you're looking for "A B C" (in order, consecutively), the expression is simply /A B C/
. Done!
If you're looking for "A foo B bar C" it might be /A.*?B.*?C/
If you're looking for "B foo A foo C" you'd be better off doing three separate tests for /A/
, /B/
, and /C/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With