繁体   English   中英

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

[英]Regex to replace text enclosed in brackets

运行时是 NodeJS,我正在尝试用名称替换文本$Contact 但我还需要能够捕获包含在大括号{}中的术语周围的单词:

Where Name = John:
  My name is $Contact => My name is John
  Hello {I am $Contact} => Hello I am John

Where 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 with

const replaceQualifier = (m, qualifier, value) =>
    m.replace(new RegExp('\\{?(.*?)\\' + qualifier + '(.*?)\\}?', 'g'), value ? `$1${value}$2` : '');

它似乎适用于没有大括号但不适用于大括号的限定符。

你需要使用

m.replace(new RegExp('(?:\\{([^{}]*))?\\' + qualifier + '(?:([^{}]*)})?', 'g'), 
   value ? `$1${value}$2` : '');

正则表达式看起来像

(?:\{([^{}]*))?\$Contact(?:([^{}]*)})?

请参阅正则表达式演示 详情

  • (?:\{([^{}]*))? - 可选出现{ ,然后(第 1 组)除{}之外的任何 0 个或多个字符
  • \$Contact - $Contact
  • (?:([^{}]*)})? - 可选出现(第 2 组)除{}之外的任何 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));

试试这个解决方案

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

Output:

My name is John
My name is John
Hello I am John
My name is 
My name is 
Hello 

该解决方案与您的解决方案非常相似,只是组的使用方式不同:

  • (?...) ... 非捕获(“普通”)括号
  • \\{(.*?) ... {后跟捕获组(.*?)
  • (?:\\{(.*?))? ...出现零次或多次
  • 右边部分同样
编辑(为什么原来的正则表达式不起作用)

在调试replace时,首先查看match的是什么,以便在没有g标志的情况下进行调试。 在这种情况下, \{?(.*?) =可选{字符,然后(分组)零个或多个任意字符,然后是qualifier ,即该组是qualifier之前的整个字符串(因为{可选的)

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM