Извлечение значения из строки с использованием предопределенного ключевого держателя строки - PullRequest
0 голосов
/ 30 апреля 2020

У меня есть следующие Array из strings:

array = [
   "My Website | :PrismicReplace|title"
   "My Website | Contact Us"
];

Я хочу l oop для этих массивов, и если элемент содержит :PrismicReplace, я хочу извлечь значение после канал, такой что :PrismicReplace|title внутри строки возвращает обратно title в качестве ключа ...

т.е.

>> my_function("My Website | :PrismicReplace|title")
title

Строка может быть:

"My Website | :PrismicReplace|someReallyReallyReallyLongParameter"

(возвращает someReallyReallyReallyLongParameter)

или

"My Website | :PrismicReplace|someReallyReallyReallyLongParameter Some Other Stuff"

(по-прежнему возвращает someReallyReallyReallyLongParameter)

Я пытался комбинация циклов и совпадений регулярных выражений, но она пока не совсем работает, как я и собирался ... но я думаю и надеюсь, что есть быстрый способ обойти это? Лучшее, что у меня есть, это:

    if (new RegExp(':PrismicReplace').test(tagDef.content)) {
      for (const [key, value] of Object.entries(prismic)) {
        let paramRegex = new RegExp(`:PrismicReplace|${key}`);
        if (paramRegex.test(tagDef.content)) {
          tagDef.content = tagDef.content.replace(paramRegex, prismic[key]);
        }
      }
    }

1 Ответ

1 голос
/ 30 апреля 2020

Вы можете использовать шаблон с группой захвата для детали после трубы.

:PrismicReplace\|([^\s|]+)

По частям

  • :PrismicReplace\| Соответствие :PrismicReplace|
  • ( Захват группа 1
    • [^\s|]+ Совпадение 1+ вхождений любого символа, кроме символа канала или пробела
  • ) Закрыть группу 1

Regex demo

let array = [
  "My Website | :PrismicReplace|title",
  "My Website | Contact Us",
  "My Website | :PrismicReplace|someReallyReallyReallyLongParameter",
  "My Website | :PrismicReplace|someReallyReallyReallyLongParameter Some Other Stuff"
];
const regex = /:PrismicReplace\|([^\s|]+)/g;
array.forEach(str => {
  while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
      regex.lastIndex++;
    }
    console.log(m[1]);
  }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...