2 回答

TA貢獻(xiàn)1813條經(jīng)驗(yàn) 獲得超2個(gè)贊
你需要使用
m.replace(new?RegExp('(?:\\{([^{}]*))?\\'?+?qualifier?+?'(?:([^{}]*)})?',?'g'),? ???value???`$1${value}$2`?:?'');
正則表達(dá)式看起來(lái)像
(?:\{([^{}]*))?\$Contact(?:([^{}]*)})?
(?:\{([^{}]*))?
- 可選出現(xiàn)and then(第 1 組)除and{
以外的任何 0 個(gè)或多個(gè)字符{
}
\$Contact
?-?$Contact
(?:([^{}]*)})?
- 可選出現(xiàn)(第 2 組)除{
and}
和 then之外的任何 0 個(gè)或多個(gè)字符}
。
參見(jiàn) 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貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超10個(gè)贊
試試這個(gè)解決方案
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
該解決方案與您的解決方案非常相似,只是組的使用方式不同:
(?...)
...非捕獲(“普通”)括號(hào)\\{(.*?)
...{
之后是捕獲的組(.*?)
(?:\\{(.*?))?
...出現(xiàn)零次或多次右邊部分同樣
編輯(為什么原來(lái)的正則表達(dá)式不起作用)
調(diào)試時(shí)replace
,首先查看match
編輯的內(nèi)容,以便在沒(méi)有g
標(biāo)志的情況下進(jìn)行調(diào)試。在這種情況下,\{?(.*?)
=可選 {
字符,然后(分組)零個(gè)或多個(gè)任意字符,然后是qualifier
,即組之前是整個(gè)字符串qualifier
(因?yàn)槭?code>{可選的)
在建議的解決方案中,整個(gè)塊 \{(.*?)
都是可選的,即匹配{...
字符串的一部分(如果存在),但不匹配其他任何內(nèi)容。
添加回答
舉報(bào)