замена регулярного выражения в JavaScript с сохранением некоторой части - PullRequest
0 голосов
/ 05 мая 2020

Мне нужно проанализировать строку, которая выглядит примерно так:

-38419-indices-foo-7119-attributes-10073-bar

Где есть числа, за которыми следуют одно или несколько слов, соединенных тире. Мне нужно получить это:

[ 
   0 => '38419-indices-foo',
   1 => '7119-attributes',
   2 => '10073-bar',
]

Я думал о попытке заменить только da sh перед числом на :, а затем использовать .split(':') - как я бы сделал это? Остальные тире заменять не хочу.

Ответы [ 2 ]

1 голос
/ 05 мая 2020

Imo, шаблон прост:

\d+\D+

Чтобы даже избавиться от завершающего -, вы можете go для

(\d+\D+)(?:-|$)

или

\d+(?:(?!-\d|$).)+

Посмотреть можно здесь:

var myString = "-38419-indices-foo-7119-attributes-10073-bar";
var myRegexp = /(\d+\D+)(?:-|$)/g;
var result = [];
match = myRegexp.exec(myString);
while (match != null) {
  // matched text: match[0]
  // match start: match.index
  // capturing group n: match[n]
  result.push(match[1]);
  match = myRegexp.exec(myString);
}

console.log(result);

// alternative 2
let alternative_results = myString.match(/\d+(?:(?!-\d|$).)+/g);
console.log(alternative_results);


Или демо на regex101.com .
0 голосов
/ 05 мая 2020

Logi c

ленивое сопоставление с использованием квантификатора .*?

Regex

.*?((\d+)\D*)(?!-)

https://regex101.com/r/WeTzF0/1

Тестовая строка

-38419-index-foo-7119-attributes-10073-bar-333333-dfdfdfdf-dfdfdfdf-dfdfdfdfdfdf-123232323-dfsdfsfsdfdf

Соответствует

Дальнейшие действия

Вам нужно отделить совпадения и вставить в желаемый массив.

...