Поиск нескольких вхождений в строке

#javascript

#javascript

Вопрос:

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

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

Пример:

 "The quick {{one}}onyx goblin {{two}}jumps over the {{three}}lazy {{four}} dwarf"

obj={
  one:"onyx",
  two:"jumps",
  three:"lazy",
  four:NULL
}
 

Обратите внимание, что {{four}} имеет значение NULL, потому что это пробел перед словом dwarf . Слово dward напрямую не привязано к {{четыре}}

благодарен за любую помощь, спасибо.

Комментарии:

1. Что делать, если {{one}} происходит несколько раз?

2. не имеет значения…. допустим, сохраните первое вхождение и проигнорируйте, если оно появится снова.

Ответ №1:

Вы могли бы использовать регулярное выражение, чтобы найти связанные свойства во входной строке и их значение. Затем используйте Object.fromEntries , чтобы превратить эти пары ключ-значение в объект. Обратите внимание, что это будет принимать последнее значение, если свойство встречается в строке более одного раза.

 const parse = (str) =>
    Object.fromEntries(Array.from(str.matchAll(/{{(w )}}(S*)/g), arr => 
        [arr[1], arr[2] || null]));

// demo
let s = "The quick {{one}}onyx goblin {{two}}jumps over the {{three}}lazy {{four}} dwarf";
let result = parse(s);
console.log(result); 

Если у вас нет поддержки matchAll , то:

 const parse = (str) => {
    let regex = /{{(w )}}(S*)/g;
    let match;
    let result = {};
    while (match = regex.exec(str)) {
        result[match[1]] = match[2] || null;
    }
    return resu<
}
// demo
let s = "The quick {{one}}onyx goblin {{two}}jumps over the {{three}}lazy {{four}} dwarf";
let result = parse(s);
console.log(result); 

Комментарии:

1. Спасибо. но что, если я не знаю названия реквизитов, но сначала должен искать их в строке. все, что находится внутри {{ … }}

2. Добавлено решение для случаев, когда вам нужно какое-либо свойство в строке.

3. второе решение — это то, что я ищу, но при тестировании его в jsbin я получаю сообщение об ошибке: «str.matchAll не является функцией»: jsbin.com/miyaliduwo/edit?js ,консоль

4. Это часть текущей версии JavaScript, ECMAScript 2020. Какую версию вы поддерживаете?

5. Добавлена версия, которая не используется matchAll .

Ответ №2:

Вы также можете поступить следующим образом:

     let a = (x) =>{
    let obj = {};
    let z = x.split(' ');
     let m = z.filter(x1 => x1.charAt(0) == '{')
    m.forEach(x2=> obj[x2.substr(2,x2.indexOf('}')-2)] = x2.substr(x2.lastIndexOf('}') 1) == '' ? null : x2.substr(x2.lastIndexOf('}') 1))
    console.log(obj);
    
}

a("The quick {{one}}onyx goblin {{two}}jumps over the {{three}}lazy {{four}} dwarf")
 

Это может решить ваш запрос.

Ответ №3:

Это будет работать

 const str = "The quick {{one}}onyx goblin {{two}}jumps over the {{three}}lazy {{four}} dwarf";
const result = {}

str.split("{{")
    .map(m => ({
        [m.split('}}')[0]]: m.includes("}}")
            amp;amp; (m.split('}}')[1].split(' ')[0] || null)
    })).filter(e => e[Object.keys(e)[0]] != false).forEach(e => { result[Object.keys(e)[0]] = Object.values(e)[0] })
console.log("result", result)
 

Ответ №4:

Этот пример немного подробный, но удовлетворяет потребности в именах переменных в {{}} .

Этот код немного подробный, но позволяет читать и понимать:

 const str = "The quick {{one}}onyx goblin {{two}}jumps over the {{three}}lazy {{four}} dwarf";

let output = str.match(/({{w*}}w*b|{{w*}} )/g).map(sub=>{
   const subArr = sub.replace('{{','').split('}}');
   const o = new Object();
   o[subArr[0]] = subArr[1];
   return o;
});

console.log(output);