Hyphen inside sets in JavaScript regex
The hyphen is also a special character inside
[ ] (but not outside). If you need the
hyphen itself as a regular character - then put
it where it will not be interpreted as a group
separator.
Why it's important: You can make a group of
characters without yourself noticing it. For
example, like this - '[:-@]' - you
think you are choosing a colon, a hyphen
and an AT symbol, but in fact you get a
group of characters between : and
@. This group includes the following
characters: ? < = > : ;
Where are they from? From the table ASCII - the colon has a number less than the an AT - and the result is a group. That is, all groups are obtained according to the ASCII table (if desired, you can use this).
How to deal with this: put a hyphen character
where it will definitely not be perceived as
a group character, for example, at the beginning
or at the end (i.e. after [ or
before ]).
You can also escape the hyphen - then it will
denote itself, regardless of position. For
example, instead of [:-@] write
[:\-@] - and there will be no more
group, but there will be three characters - a
colon, a hyphen and an AT @.
Example
In the following example, the search pattern
is: digit 1, then a letter from
'a' to 'z', then digit
2:
let str = '1a2 1-2 1c2 1z2';
let res = str.replace(/1[a-z]2/g, '!');
As a result, the following will be written to the variable:
'! 1-2 ! !'
Example
Let's now escape the hyphen. The resulting
search pattern is: digit 1 followed
by letter 'a' or hyphen or letter
'z' followed by digit 2:
let str = '1a2 1-2 1c2 1z2';
let res = str.replace(/1[a\-z]2/g, '!');
As a result, the following will be written to the variable:
'! ! 1c2 !'
Example
You can just rearrange the hyphen without escaping it:
let str = '1a2 1-2 1c2 1z2';
let res = str.replace(/1[az-]2/g, '!');
As a result, the following will be written to the variable:
'! ! 1c2 !'
Example
In the following example, the search
pattern is: the first character is
small letters or a hyphen '-',
then two letters 'x':
let str = 'axx Axx -xx @xx';
let res = str.replace(/[a-z-]xx/g, '!');
As a result, the following will be written to the variable:
'! Axx ! @xx'
Example
In the following example, the search
pattern is: the first character is
small, capital letters or a hyphen
'-', then two letters 'x':
let str = 'axx Axx -xx @xx';
let res = str.replace(/[a-zA-Z-]xx/g, '!');
As a result, the following will be written to the variable:
'! ! ! @xx'
Example
You can place a hyphen between two groups - there it definitely won't make one more group:
let str = 'axx 9xx -xx @xx';
let res = str.replace(/[a-z-0-9]xx/g, '!');
As a result, the following will be written to the variable:
'! ! ! @xx'
Practical tasks
Given a string:
let str = 'xaz xBz xcz x-z x@z';
Find all strings with the following
pattern: letter 'x', capital
or small letter or hyphen, letter
'z'.
Given a string:
let str = 'xaz x$z x-z xcz x+z x%z x*z';
Find all strings with the following
pattern: letter 'x', then
either dollar, or hyphen or plus sign,
then letter 'z'.