At this stage, we know how to match any set of characters using vague matchers, and we have the ability to repeat the patterns for any kind of sequence using multipliers, which gives you a pretty good base for matching just about anything. However, even with all this in place, there is one situation that has a tendency to come up and can be an issue. It occurs when dealing with two different and completely separate acceptable forms of input.
Let's say we are parsing some kind of form data, and for each question, we want to extract either a yes or no to be stored somewhere. With our current level of expertise, we can create a pattern similar to /[yn][eo]s?/g
, which would match both yes
and no
. The real problem with this is that it will also match all the other six configurations of these letters, which our app probably won't know how to handle:
Luckily, Regex has a completely different system in place to hand situations like this and it is in the form of the (|
) pipe character. It is similar to the OR operator you would use in an if
statement, except instead of two, you just use one here. How it works is, you separate the different patterns you want to match by a pipe, and then any of the patterns can return a match. Changing our previous Regex pattern with /yes|no/g
will then show the correct results:
Well, at least it almost will, though it will still match no
in nos
. However, this is because we have been using open patterns and not really enforcing complete words (this is a topic in the next chapter).
The pipe character, though, is not limited to just two options, we can easily match a large array of values by splitting each of them by the pipe character. Also, we are not constrained to just using plain text, and each segment in our Regex split can be its own pattern using ranges and multipliers.