A pot
TomatoRomaVF1
A pot
Rosemary
A pot
AppleGalaMust696
A pot
WheatNorin10
A pot
Primrose
A pot
CornPioneer3751
123456
let garden = [
	"Tomato 'Roma VF1'", "Rosemary", 
	"Apple 'Gala Must 696'", 
	"Wheat 'Norin 10'", "Primrose", 
	"Corn 'Pioneer 3751'"
];
123456
for  (const plant of garden) {
if (plant.match(//i) {
fertilize(plant);
}
}
Lesson 19 / 42

Lesson task •

Fertilize plants witch name starts with "A", "B" or "C" AND has at least one digit between 0 and 5 or between 7 and 9.

Single character from a custom symbol class

[...] again

Matches single character from the specified range of symbols

Ranges can be specified not only between digits, but also between letters:

12345678
console.log(!!"a".match(/[a-z]/)) // true 
console.log(!!"z".match(/[a-z]/)) // true 
console.log(!!"A".match(/[a-z]/)) // false 
console.log(!!"Z".match(/[a-z]/)) // false 
console.log(!!"a".match(/[A-Z]/)) // false 
console.log(!!"z".match(/[A-Z]/)) // false 
console.log(!!"A".match(/[A-Z]/)) // true 
console.log(!!"Z".match(/[A-Z]/)) // true 

You can combine ranges from lowercase to uppercase letters into one range:

1234
console.log(!!"a".match(/[A-z]/)) // true 
console.log(!!"z".match(/[A-z]/)) // true 
console.log(!!"A".match(/[A-z]/)) // true 
console.log(!!"Z".match(/[A-z]/)) // true 

But be careful determining case-agnostic range: the range should start with uppercase letter, not reverso: /[a-Z]/ throws an error. This is because under the hood the regular expressions uses ASCII table to determine which symbols are included in the range: it finds the ASCII codes of the start of range and the end of range symbols and all the symbols with codes in between are included in the range. "Z" has lower ASCII code than "a", so the the resulting range /[a-Z]/ is empty.

Other consequence is that /[A-z]/ among the letters in all the cases also includes some special symbols that lies in ASCII table between "A" and "z":

123456
console.log(!!"[".match(/[A-z]/)) // true 
console.log(!!"\".match(/[A-z]/)) // true 
console.log(!!"]".match(/[A-z]/)) // true 
console.log(!!"^".match(/[A-z]/)) // true 
console.log(!!"_".match(/[A-z]/)) // true 
console.log(!!"`".match(/[A-z]/)) // true 

If you want to restrict the range with only latins without special symbols you probably should use combination of two ranges "cutting" off the special symbols in between:

12345678910
console.log(!!"a".match(/[A-Za-z]/)) // true 
console.log(!!"z".match(/[A-Za-z]/)) // true 
console.log(!!"A".match(/[A-Za-z]/)) // true 
console.log(!!"Z".match(/[A-Za-z]/)) // true 
console.log(!!"[".match(/[A-Za-z]/)) // false 
console.log(!!"\".match(/[A-Za-z]/)) // false 
console.log(!!"]".match(/[A-Za-z]/)) // false 
console.log(!!"^".match(/[A-Za-z]/)) // false 
console.log(!!"_".match(/[A-Za-z]/)) // false 
console.log(!!"`".match(/[A-Za-z]/)) // false 

Keeping in ming the underlying mechanics of the symbol classes ranges, we can define ranges of special symbols:

123456789101112131415
console.log(!!"!".match(/[!-/]/)) // true 
console.log(!!""".match(/[!-/]/)) // true 
console.log(!!"#".match(/[!-/]/)) // true 
console.log(!!"$".match(/[!-/]/)) // true 
console.log(!!"%".match(/[!-/]/)) // true 
console.log(!!"&".match(/[!-/]/)) // true 
console.log(!!"'".match(/[!-/]/)) // true 
console.log(!!"(".match(/[!-/]/)) // true 
console.log(!!")".match(/[!-/]/)) // true 
console.log(!!"*".match(/[!-/]/)) // true 
console.log(!!"+".match(/[!-/]/)) // true 
console.log(!!",".match(/[!-/]/)) // true 
console.log(!!"-".match(/[!-/]/)) // true 
console.log(!!".".match(/[!-/]/)) // true 
console.log(!!"/".match(/[!-/]/)) // true 

Now we can craft ourselves some of the predefined symbol classes from the previous lessons:

  • \w equals to [A-Za-z0-9_]
  • \s equals to [ \t\n\r\f]
  • \d equals to [0-9]