2 回答
TA贡献1813条经验 获得超2个赞
你需要使用
m.replace(new RegExp('(?:\\{([^{}]*))?\\' + qualifier + '(?:([^{}]*)})?', 'g'), value ? `$1${value}$2` : '');
正则表达式看起来像
(?:\{([^{}]*))?\$Contact(?:([^{}]*)})?
(?:\{([^{}]*))?
- 可选出现and then(第 1 组)除and{
以外的任何 0 个或多个字符{
}
\$Contact
-$Contact
(?:([^{}]*)})?
- 可选出现(第 2 组)除{
and}
和 then之外的任何 0 个或多个字符}
。
参见 JS 演示:
const replaceQualifier = (m, qualifier, value) =>
m.replace(new RegExp('(?:\\{([^{}]*))?\\' + qualifier + '(?:([^{}]*)})?', 'g'), value ? `$1${value}$2` : '');
const qualifier = '$Contact';
let m = 'Hello {I am $Contact}';
let value = 'John';
console.log(replaceQualifier(m, qualifier, value));
value = '';
console.log(replaceQualifier(m, qualifier, value));
m = 'My name is $Contact';
value = 'John';
console.log(replaceQualifier(m, qualifier, value));
value = '';
console.log(replaceQualifier(m, qualifier, value));
TA贡献1831条经验 获得超10个赞
试试这个解决方案
var str1 = "My name is $Contact"
var str2 = "My name is {$Contact}"
var str3 = "Hello {I am $Contact}"
const replaceQualifier = (m, qualifier, value) =>
m.replace(new RegExp(`(?:\\{(.*?))?\\${qualifier}(?:(.*?)\\})?`), value ? `$1${value}$2` : '');
console.log(replaceQualifier(str1,"$Contact","John"))
console.log(replaceQualifier(str2,"$Contact","John"))
console.log(replaceQualifier(str3,"$Contact","John"))
console.log(replaceQualifier(str1,"$Contact"))
console.log(replaceQualifier(str2,"$Contact"))
console.log(replaceQualifier(str3,"$Contact"))
输出:
My name is John
My name is John
Hello I am John
My name is
My name is
Hello
该解决方案与您的解决方案非常相似,只是组的使用方式不同:
(?...)
...非捕获(“普通”)括号\\{(.*?)
...{
之后是捕获的组(.*?)
(?:\\{(.*?))?
...出现零次或多次右边部分同样
编辑(为什么原来的正则表达式不起作用)
调试时replace
,首先查看match
编辑的内容,以便在没有g
标志的情况下进行调试。在这种情况下,\{?(.*?)
=可选 {
字符,然后(分组)零个或多个任意字符,然后是qualifier
,即组之前是整个字符串qualifier
(因为是{
可选的)
在建议的解决方案中,整个块 \{(.*?)
都是可选的,即匹配{...
字符串的一部分(如果存在),但不匹配其他任何内容。
添加回答
举报