RegExp получить любое значение между символами с самими символами

пытаюсь получить значение в стринге между символами и немного не хватает опыта в написании RegExp. Буду рад любой помощи.

У меня есть стрига Hello ___world___ из нее мне нужно получить _world_. вместо world может быть другое любое значение. К примеру:

Hello ______ -> должно вернуть null/undefined

Hello ___world__ -> должно вернуть _world_

Hello ___wor_l_d___ -> должно вернуть _wor_l_d_

Hello __*$world__ -> должно вернуть _*$world_

Hello world__ -> должно вернуть null/undefined

Сейчас у меня выходит так:

const reg = /(?<=_)(.*)(?=_)/;
const string1 = "Hello ___world___";
const string2 = "Hello ______";
const string3 = "Hello ___wor_l_d___";
const string4 = "Hello ___*$world___";
const string5 = "Hello world__";

console.log(string1.match(reg));
console.log(string2.match(reg));
console.log(string3.match(reg));
console.log(string4.match(reg));
console.log(string5.match(reg));


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

Автор решения: Wiktor Stribiżew

Используйте

/_[^_]+(?:_[^_]+)*_/g

См. пример работы регулярного выражения.

Подробности:

  • _ - символ _
  • [^_]+ - один и более символов, отличных от символа _
  • (?:_[^_]+)* - ноль и более повторов символа _, за которым следует один и более символов, отличных от символа _
  • _ - символ _.

См. пример работы кода на JavaScript:

const reg = /_[^_]+(?:_[^_]+)*_/g;
const strings = ["Hello ___world___", "Hello ______", "Hello ___wor_l_d___", "Hello ___*$world___", "Hello world__"];
for (const s of strings) {
  console.log(s, '=>', s.match(reg)?.[0]);
}

→ Ссылка