Форма регулярного выражения, чтобы получить очки каждого человека как JS объект - PullRequest
0 голосов
/ 19 февраля 2020

У меня есть эта строка:

Phantom_FR - 5 Points\n\nmineblox17,Dominus_Loading - 0 Points\n\ndavidroks528,beeks567,JohnDoe54631 - 4 Points\n\n\n\n **PLEASE ARCHIVE THIS CARD WHEN YOU ARE FINISHED WITH IT**,

Мне нужно вернуть что-то вроде:

{"5":["Phantom_FR], "0":[mineblox17, Dominus_Loading]}

... и так далее. Я не могу понять это.

Кодируется в этот формат на другом языке, так что это не поможет. Как мне извлечь нужную информацию?

1 Ответ

0 голосов
/ 19 февраля 2020

Шаблон /([^\n][\w,]+) - (\d+) Points/g кажется достаточным для вашего варианта использования. Это помещает разделенный запятыми список имен пользователей в первой группе и точек во второй группе.

Обратите внимание, что предполагается, что точки предварительно сгруппированы и между ними не будет столкновений, в противном случае ключ будет перезаписан. Также предполагается, что каждой группе имен пользователей предшествует новая строка или начало строки.

Браузер JS:

const s = "Phantom_FR - 5 Points\n\nmineblox17,Dominus_Loading - 0 Points\n\ndavidroks528,beeks567,JohnDoe54631 - 4 Points\n\n\n\n **PLEASE ARCHIVE THIS CARD WHEN YOU ARE FINISHED WITH IT**";

const pattern = /([^\n][\w,]+) - (\d+) Points/g;
const usersByPoints = Object.fromEntries([...s.matchAll(pattern)]
  .map(([, users, points]) => [points, users.split(",")]));
console.log(usersByPoints);

NodeJS:

const s = "Phantom_FR - 5 Points\n\nmineblox17,Dominus_Loading - 0 Points\n\ndavidroks528,beeks567,JohnDoe54631 - 4 Points\n\n\n\n **PLEASE ARCHIVE THIS CARD WHEN YOU ARE FINISHED WITH IT**";

const pattern = /([^\n][\w,]+) - (\d+) Points/g;
const usersByPoints = {};

for (let m; m = pattern.exec(s); usersByPoints[m[2]] = m[1].split(","));

console.log(usersByPoints);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...