javascript - Regex pentru a găsi potrivirea dacă există două puncte între acolade duble {{cheie:valoare}}


Încerc să refactorizez metoda de mai jos pentru a folosi regex în loc de indexOf:

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

În prezent, verifică pur și simplu dacă există dublu paranteze "{{" și două puncte în șir. Aceasta semnalează potriviri pentru două puncte în afara șirurilor de înlocuire, pe care nu vreau să le înlocuiesc.

Trebuie să returnez un rezultat doar dacă există un două puncte între două paranteze duble cu perechi cheie/valoare precum: {{key:value}}

Iată ce am improvizat folosind câteva exemple de aici (sunt, evident, un începător complet în regex):

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

Dar în prezent sunt blocat cu această eroare:

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

Răspuns #1

Poți folosi un regex care se potrivește cu un două-puncte între {{ (ambele acolade trebuie să fie scăpate cu \) și }}, cu caractere opționale care nu sunt } între ele:

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

Răspunsul #2

În funcție de caracterele permise pentru key și value și de faptul că cheia și valoarea nu pot fi șiruri goale:

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

Demonstrație Regex

Sau o versiune mai strictă fără a potrivi caracterele de spațiu alb:

{{\w+:\w+}}

Demonstrație Regex

Pentru a potrivi o cheie și o valoare, unde cheia și valoarea nu sunt unul dintre { } :

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

Modelul se potrivește:

  • {{ Potrivește literal
  • [^{}:]* Potrivește caractere opționale, altele decât { } :
  • [^\s{}:] Potrivește un caracter care nu este spațiu alb și nici { } :
  • [^{}:]* Potrivește caractere opționale, altele decât { } :
  • : Potrivește un două-puncte
  • [^{}:]*[^\s{}:][^{}:]* Același tipar ca înainte de două puncte
  • }} Potrivește literal

Demonstrație Regex

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