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

时间:2020-09-21 15:47:20

标签: javascript regex

运行时是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` : '');

对于没有大括号但没有大括号的预选赛似乎很有效。

2 个答案:

答案 0 :(得分:3)

您需要使用

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

正则表达式看起来像

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

请参见regex demo详细信息

  • (?:\{([^{}]*))?-可选出现的{,然后(第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));

答案 1 :(得分:0)

尝试此解决方案

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标志的情况下进行调试。 在这种情况下,\{?(.*?) = 可选 {个字符,然后(分组)零个或多个 any 个字符,然后qualifier ,即该组是qualifier之前的整个字符串(因为{可选

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