为了账号安全,请及时绑定邮箱和手机立即绑定

正则表达式替换括号中的文本

正则表达式替换括号中的文本

牧羊人nacy 2023-03-18 16:08:42
$Contact运行时是 NodeJS,我正在尝试用名称替换文本。但我还需要能够捕获围绕在大括号中的术语的单词{}:Where Name = John:  My name is $Contact => My name is John  Hello {I am $Contact} => Hello I am JohnWhere Name = null:  My name is $Contact => My name is   Hello {I am $Contact} => Hello这个想法是用字符串替换$Contact限定符,并且可选地,括号中的文本仅在字符串不为空时才会显示。大括号的使用是可选的。// m = Message template (Hello {I am $Contact})// qualifier = $Contact// value = value to replace withconst replaceQualifier = (m, qualifier, value) =>    m.replace(new RegExp('\\{?(.*?)\\' + qualifier + '(.*?)\\}?', 'g'), value ? `$1${value}$2` : '');它似乎适用于没有大括号但不适用于大括号的限定符。
查看完整描述

2 回答

?
慕姐8265434

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));


查看完整回答
反对 回复 2023-03-18
?
慕哥6287543

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(因为是{可选

在建议的解决方案中,整个块 \{(.*?)都是可选的,即匹配{...字符串的一部分(如果存在),但不匹配其他任何内容。


查看完整回答
反对 回复 2023-03-18
  • 2 回答
  • 0 关注
  • 261 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信