RegEx захватывает подстроки из многострочной строки и преобразует их в структуру данных объекта - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть многострочная строка, подобная этой:

url=www.website-one.com/number&id=2222&key=rer
type=web
version=3
url=www.website-two.com/number&id=9999&key=abc
type=web
version=5

В списке может быть больше строк, то есть больше строк с URL=.

Цель состоит в том, чтобы получить эту структуру объекта JavaScript:

{
    "url": "www.website-one.com/number&id=2222&key=rer",
    "id": "2222",
},
{
    "url": "www.website-two.com/number&id=9999&key=abc",
    "id": "9999",
}

Как этого добиться в JavaScript?

Если в списке найдено больше URL=, JSON также должен иметь их.

Как бы я попытался ее решить:

  1. Захват URL-адресов с помощью RegEx из списка, чтобы просто отобразить URL-адреса в списке
  2. Затем захват с каждогострока с RegEx с критерием: Получить все после url= - записать это в строку с именем URL
  3. Затем записать в копию строки URL RegEx с критерием: Получить все после ID= до &

Что я уже пробовал

function start_regex() {
    var str = `
    url=www.website-one.com/number&id=2222&key=rer
    type=web
    version=3
    url=www.website-two.com/number&id=9999&key=abc
    type=web
    version=5
  `;

    //regex show only URL until end of line
    var RegExpURLonly = /url=.*([^\n]+)/g;
    var URLonly = RegExpURLonly.exec(str);


    while (URLonly != null) {
        console.log('This is URL only: ' + URLonly[1]);
        URLonly = RegExpURLonly.exec(str);
    }

    //regex show only id
    var RegExIDonly = /id=([^&]+)/g;
    var IDonly = RegExIDonly.exec(URLonly);


    while (IDonly != null) {
        console.log('This is ID only: ' + IDonly[1]);
        IDonly = RegExIDonly.exec(str); 
    }
}

1 Ответ

0 голосов
/ 16 декабря 2018

Вероятно, проще начать с разделения на пробелы:

str.split(/\s+/)

Затем вы можете отфильтровать полученный массив для строк, начинающихся с url=, что даст вам массив URL:

var str = `
    url=www.website-one.com/number&id=2222&key=rer
    type=web
    version=3
    url=www.website-two.com/number&id=9999&key=abc
    type=web
    version=5
  `;

let urls = str.split(/\s+/).filter(s => s.startsWith('url='))
console.log(urls)

Затем вы можете map() по массиву и найти id и вернуть объект с URL и идентификатором:

var str = `
    url=www.website-one.com/number?key=rer&id=2222
    type=web
    version=3
    url=www.website-two.com/number&id=9999&key=abc
    type=web
    version=5
  `;

let urls = str.split(/\s+/).filter(s => s.startsWith('url='))
let result = urls.map(url => {
    let regex = /[?&]id=(.+?)(&.*)?$/g
    let id = regex.exec(url)
    if (id) id = id[1]
    return {url:url.slice(4), id}     // slice(4) to remove the initial "url="
})
console.log(urls)
console.log(result)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...