Since 2015, JavaScript has improved immensely.
It’s much more pleasant to use it now than ever.
In this article, we’ll look at new JavaScript regex features.
Search and the y Flag
The String.prototype.search method ignores the y flag.
lastIndex isn’t changed by it.
For example, if we have:
const REGEX = /foo/y;
REGEX.lastIndex = 8;
const match = 'barfoobarfoo'.search(REGEX);
console.log(match.index);
console.log(REGEX.lastIndex);
Then match us undefined and lastIndex stays at 8.
We can only search from the beginning of the string with it.
The String.prototype.match works differently depending on whether the g flag is added with y .
If g isn’t, it works like exec .
If g is set, then it returns an array with string parts that’s matched or null .
For instance, if we write:
const REGEX = /a/;
REGEX.lastIndex = 7;
console.log('abab'.match(REGEX).index);
console.log(REGEX.lastIndex);
Then indx is 0, and lastIndex is 7.
It gets the first if no flag is added.
If we add the y flag:
const REGEX = /a/y;
REGEX.lastIndex = 2;
console.log('abab'.match(REGEX).index);
console.log(REGEX.lastIndex);
Then the match is only returned if the search starts from the lastIndex .
The index must be exact.
lastIndex will then be updated after the match is found.
If the g flag is set, then match will match all the substrings and put them in the array.
For example, we can write:
const REGEX = /a|b/g;
REGEX.lastIndex = 0;
console.log('abab'.match(REGEX));
console.log(REGEX.lastIndex);
And match returns [“a”, “b”, “a”, “b”] .
lastIndex is still 0.
lastIndex is ignored with the g flag enabled.
The result is the same with the gy flags added.
match and lastIndex all give us the same result.
Split Strings
String.prototype.split method lets us split a string.
The y flag will make the method’s behavior change.
For example, we can write:
console.log('abb'.split(/b/y))
console.log('bba'.split(/b/y))
The strings will be split with b as the separator.
So we get:
["a", "", ""]
and
["", "", "a"]
The y flag works regardless of the location of the flag.
We can also put the pattern in a capturing group:
console.log('abb'.split(/(b)/y))
Then we get:
["a", "b", "", "b", ""]
as the result.
Replace Strings
TheString.prototype.replace method lets us replace strings by matching them with a regex.
For instance, if we write:
const REGEX = /a/;
console.log('baba'.replace(REGEX, 'x'));
Then we get 'bxba’ logged.
It only logs the first entry that’s matched.
If the y flag is added, we also get at most one match.
But the match is always searched from the beginning of the string.
For example, if we have:
const REGEX = /a/y;
REGEX.lastIndex = 2;
console.log('baba'.replace(REGEX, 'x'));
Then we get 'baba’ logged.
If the lastIndex is beyond the first match, then it’ll be ignored even if there’s a match available.
With the g flag, the replace replaces all matches.
So, if we have:
const REGEX = /a/g;
REGEX.lastIndex = 2;
console.log('baba'.replace(REGEX, 'x'));
Then we get 'bxbx' logged.
If we combine the g and y flags:
const REGEX = /a/gy;
console.log('baba'.replace(REGEX, 'x'));
Then 'baba’ is returned from the replace method.
But if we have:
const REGEX = /a/gy;
console.log('aaba'.replace(REGEX, 'x'));
Then we get ‘xxba’ . This means that the first match must be at the beginning of the string for replace to work.
Conclusion
The y flag is a new flag introduced with ES6 which works differently with different methods.