Почему регулярка захватывает больше, чем необходимо?

Есть реуглярка:

'.+'

Есть код:

t('-').map((word, index) => (index ? `${word[0].toUpperCase()}${word.slice(1)}` : word)).join('')

Ожидание:

'-'

Реальность:

'-').map((word, index) => (index ? `${word[0].toUpperCase()}${word.slice(1)}` : word)).join(''

Ответы (1 шт):

Автор решения: another_login

По умолчанию квантификаторы (+ в Вашем случае) являются "жадными", и покрывают максимальную последовательность. Вам нужно добавить ?, чтобы сделать их "нежадными" (также "ленивыми"), тогда они станут покрывать минимальную последовательность. https://developer.mozilla.org/ru/docs/Web/JavaScript/Guide/Regular_Expressions#special-questionmark

const test_data = ["t('-').map((word, index) => (index ? `${word[0].toUpperCase()}${word.slice(1)}` : word)).join('')", "t('фывфывф')", "'1'2'3'4'5'"];

const regex = /'.+?'/;

for (t in test_data) {
  let m = test_data[t].match(regex);
  console.log(test_data[t], '→', m !== null ? m[0] : null);
}

а если ленивых квантификаторов в используемом движке нет?

Тогда, в данном случае, я искал бы не любой символ, а "не одинарную кавычку":

const test_data = ["t('-').map((word, index) => (index ? `${word[0].toUpperCase()}${word.slice(1)}` : word)).join('')", "t('фывфывф')", "'1'2'3'4'5'"];

const regex = /'[^']+'/;

for (t in test_data) {
  let m = test_data[t].match(regex);
  console.log(test_data[t], '→', m !== null ? m[0] : null);
}

→ Ссылка