Я пытаюсь реорганизовать метод ниже, чтобы использовать регулярное выражение вместо 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')



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вы можете использовать регулярное выражение, которое соответствует двоеточию между {{ (обе скобки необходимо экранировать с помощью \) и }}, с необязательными символами, отличными от }, между ними:
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}]*.* на +.