Регулярное выражение для поиска совпадения, если между двойными фигурными скобками существует двоеточие {{key:value}}

Я пытаюсь реорганизовать метод ниже, чтобы использовать регулярное выражение вместо indexOf:

hasMatch(value: any): boolean {
    if (isDefined(value)) {
      const valueStr = JSON.stringify(value);
      return valueStr.indexOf('{{') > -1 && valueStr.indexOf(':') > -1;
    } else {
      return false;
    }
  }

В настоящее время он просто проверяет, есть ли в строке двойные скобки "{{" и двоеточие. Это флаги совпадений двоеточий за пределами строк замены, которые я не хочу заменять.

Мне нужно вернуть совпадение только в том случае, если между двумя двойными скобками существует двоеточие с парами ключ/значение, например: {{key:value}}

Вот что я собрал, используя несколько примеров (очевидно, я полный новичок в регулярных выражениях):

const matches = valueStr.match(/\{{({^\}{}*)}}/g).map(x => `[${x.replace(/[^:]/g, '')}]`)

Но в настоящее время я застрял на этой ошибке:

main.js:66071 ERROR TypeError: Cannot read properties of null (reading 'map')

Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
0
111
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

Вы можете использовать регулярное выражение, которое соответствует двоеточию между {{ (обе скобки необходимо экранировать с помощью \) и }}, с необязательными символами, отличными от }, между ними:

const valueStr = "{{key: value}}"
console.info(valueStr.match(/\{\{[^}]*:[^}]*}}/) != null)

В зависимости от разрешенных символов key и value, а также ключа и значения не могут быть пустые строки:

{{\s*\w+\s*:\s*\w+\s*}}

Демонстрация регулярных выражений

Или более строгая версия без совпадения пробельных символов:

{{\w+:\w+}}

Демонстрация регулярных выражений

Чтобы сопоставить ключ и значение, где ключ и значение не являются одними из {}:

{{[^{}:]*[^\s{}:][^{}:]*:[^{}:]*[^\s{}:][^{}:]*}}

Шаблон соответствует:

  • {{ Сопоставить буквально
  • [^{}:]* Сопоставьте необязательные символы, кроме {}:.
  • [^\s{}:] Соответствует символу без пробелов, кроме {}:
  • [^{}:]* Сопоставьте необязательные символы, кроме {}:.
  • : Сопоставьте двоеточие
  • [^{}:]*[^\s{}:][^{}:]* Та же картина, что и перед двоеточием.
  • }} Сопоставить буквально

Демонстрация регулярных выражений

const regex = /{{[^{}:]*[^\s{}:][^{}:]*:[^{}:]*[^\s{}:][^{}:]*}}/;
[
  "{{key:value}}",
  "{{ key : value }}",
  "{{ke#$%$%y:val#!$#$^$%^$%^^%$*&%ue }}",
  "{{:}}",
  "{{key:}}",
  "{{key: }}",
  "{{:value}}",
  "{{key:value:test}}"
].forEach(s =>
  console.info(`${s} --> ${regex.test(s)}`)
)

вы можете использовать регулярное выражение {{([^:]+):([^}]+)}} для получения пары ключ-значение, ключа и значения в трех отдельных группах.

const groups = "{{key: value}}".match(/\{\{([^:]+):([^}]+)\}\}/);
console.info(groups);

Для этого вы можете использовать следующую функцию (моя консоль не распознала синтаксис вашей функции).

const hasMatch = function (s) {
    return s.match(/\{\{([^:]*):([^:}]*)\}\}/) != undefined;
}

Вот объяснение регулярного выражения, поскольку вы сказали, что вы новичок в нем.

^      // start of input
\{\{   // find two { in a row
[^:]*  // find zero or more characters not found between [^ and ]
:      // find a colon
[^:}]* // find zero or more characters not found between [^ and ]
\}\}   // find two } in a row
$      // end of input

hasMatch("{{key:value}}")  // true
hasMatch("{{:}}")          // true
hasMatch("{{key:va:lue}}") // false (extra colon)
hasMatch("{{key value}}")  // false (no colon separator)
hasMatch("{{key,value}}")  // false (no colon separator)
hasMatch("{{key:value}")   // false (only one leading curly brace)
hasMatch("{key:value}}")   // false (only one trailing curly brace)
hasMatch("{{}}")           // false (no colon separator)

Примечания:

  • Это регулярное выражение предполагает, что значение не содержит }.
  • Если ваши ключи и значения гарантированно состоят только из символов, вы можете использовать \w* вместо [^:]* и [^:}]*.
  • Если ваши ключи/значения должны включать пробелы, используйте [^:\s]* и [^:\s}]*.
  • Если ваши ключи и значения не могут быть пустыми, замените * на +.
  • В формате JSON ключ и значение будут заключены в кавычки. В этом случае эта функция все равно распознает их.

Другие вопросы по теме