У меня проблема с регулярным выражением, и я уменьшил ее до этого кода:
const ENV_NAME_REGEX = '[a-zA-Z_]+[a-zA-Z0-9_]*'
const array = ["VALID", "9INVALID"]
array.forEach((item) => {
const valid = new RegExp(ENV_NAME_REGEX).test(item)
console.log(valid)
})
Фактический выход:
правда правда
Ожидаемый результат:
true, false
Второй элемент массива не соответствует правилу регулярного выражения (потому что первый символ не может быть числом). Итак, почему он выводит оба значения как истинные?
Вам нужны якоря: ^
в начале и $
в конце. В противном случае ваше регулярное выражение соответствует тексту в середине строки.
const ENV_NAME_REGEX = '^[a-zA-Z_]+[a-zA-Z0-9_]*$'
// ---------------------^-----------------------^
const array = ["VALID", "9INVALID"]
array.forEach((item) => {
const valid = new RegExp(ENV_NAME_REGEX).test(item)
console.log(valid)
})
Замечание: запрещая действительно хорошую причину сделать что-то еще, используйте литерал-литеральное обозначение регулярного выражения, а не строковое обозначение и конструктор, поэтому вам не нужно работать с двойным экранированием; и повторное использование экземпляра:
const ENV_NAME_REGEX = /^[a-zA-Z_]+[a-zA-Z0-9_]*$/
const array = ["VALID", "9INVALID"]
array.forEach((item) => {
const valid = ENV_NAME_REGEX.test(item)
console.log(valid)
})
(Мы знаем, что безопасно повторно использовать экземпляр, потому что нет флага g
. Когда есть флаг g
, он безопасен, если вы тщательно его обрабатываете.)
используйте якоря ^ и $, иначе это даст истину для частичного соответствия
Для RegExp.prototype.test()
достаточно частичного совпадения.
Из документации MDN:
Используйте
test()
когда вы хотите узнать, найден ли шаблон в строке [...]