regex.test возвращает неожиданный результат

1

У меня проблема с регулярным выражением, и я уменьшил ее до этого кода:

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

Второй элемент массива не соответствует правилу регулярного выражения (потому что первый символ не может быть числом). Итак, почему он выводит оба значения как истинные?

  • 2
    Просто совет, когда вы застряли с regex, используйте онлайн-портал, например regex101.com, который объясняет, что делает ваш текущий и проверяет, соответствует ли он требованиям.
Теги:

3 ответа

1
Лучший ответ

Вам нужны якоря: ^ в начале и $ в конце. В противном случае ваше регулярное выражение соответствует тексту в середине строки.

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, он безопасен, если вы тщательно его обрабатываете.)

  • 0
    спасибо за советы - с вашей стороны нет, у меня есть привычка использовать строковую нотацию, чтобы я мог использовать переменные в регулярном выражении - возможно ли использование переменной с литеральной нотацией? большое спасибо - приму ваш ответ, как только это позволит мне
  • 1
    @ danday74: Нет, чтобы построить выражение с переменными, вам нужно использовать конструктор. Но я бы избегал конструктора, когда вам не нужно создавать регулярные выражения с переменным вводом (по моему опыту, необходимость создавать динамические довольно редко).
1

используйте якоря ^ и $, иначе это даст истину для частичного соответствия

1

Для RegExp.prototype.test() достаточно частичного совпадения.

Из документации MDN:

Используйте test() когда вы хотите узнать, найден ли шаблон в строке [...]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню