Регулярные выражения соответствуют последовательности чисел и символа.между ними - PullRequest
1 голос
/ 25 сентября 2019

Итак, мне нужно получить все ${{1.33.98}} строки из строки.

new RegExp('\\$\\{\\{(.*?)\\}\\}', 'g'); плохо работает в таких случаях, как:

${{1.33.98}${{2.44.1}} - должно соответствовать только ${{2.44.1}}, поскольку ${{1.33.98} отсутствует } в этом примере.

Таким образом, он не должен совпадать, если в строке отсутствует какой-либо из двух {{ или двух }} или $.

Между {{ и }} может быть толькопоследовательность чисел, разделенных точкой - напр.4.23.4545

Спасибо

1 Ответ

1 голос
/ 25 сентября 2019

Вы соответствуете нежелательным значениям, потому что . может соответствовать любому символу, и, таким образом, он соответствует любым символам от самого левого {{ до первого }} справа от {{.

Вы можетеиспользуйте

/\${{(\d[\d.]*)}}/g

Или, если важен формат числа, разделенного точками

/\${{(\d+(?:\.\d+)*)}}/g

См. это regex demo и это regex demo .

Обратите внимание, что если строки предварительно проверены, и вы уверены, что внутри ${{ и }} нет { и }, вы можете даже использовать [^{}]* вместо \d[\d.]*:

/\${{([^{}]*)}}/g

Итак, вы либо захватываете

  • \d[\d.]* - цифру, а затем 0 или более цифр и точекили же
  • \d+(?:\.\d+)* - 1+ цифр и затем 0+ повторений . и 1+ цифр.

JS demo:

const s = '${{1.33.98}${{2.44.1}} ${{1.24.52.44.1}}';
let m = [...s.matchAll(/\${{(\d[\d.]*)}}/g)];
console.log(Array.from(m, x => x[1]));

Для устаревших версий ES:

var s = '${{1.33.98}${{2.44.1}} ${{1.24.52.44.1}}';
var rx = /\${{(\d[\d.]*)}}/g, results = [], m;
while (m=rx.exec(s)) {
  results.push(m[1]);
}
console.log(results);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...