我正在尝试重构下面的方法以使用正则表达式而不是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')
您可以使用正则表达式来匹配
{{
之间的冒号(两个括号都需要用 \
进行转义)和 }}
,之间有可选的非 }
字符:
const valueStr = "{{key: value}}"
console.log(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.log(`${s} --> ${regex.test(s)}`)
)