如果双大括号 {{key:value}} 之间存在冒号,则使用正则表达式查找匹配项

问题描述 投票:0回答:2

我正在尝试重构下面的方法以使用正则表达式而不是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 angular regex typescript
2个回答
3
投票

您可以使用正则表达式来匹配

{{
之间的冒号(两个括号都需要用
\
进行转义)和
}}
,之间有可选的非
}
字符:

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


2
投票

根据

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.log(`${s} --> ${regex.test(s)}`)
)

© www.soinside.com 2019 - 2024. All rights reserved.