Javascript正则表达式替换条件

时间:2016-12-10 23:47:53

标签: javascript regex

我想在JavaScript中使用正则表达式来替换多行文本中的某些单词。 起源:

  多卡(1)年满20岁。多卡,(2)唯一的是我的朋友。 Sole告诉我"多卡(3)是一个很好的gỉr!"
  多卡:(4)哈马学校的学生   我昨天遇见了多卡(5)。

按预期更换结果:

  

Bob (1)年满20岁。 鲍勃,(2)唯一的是我的朋友。 Sole告诉我"多卡(3)是一个很好的gỉr!"
  多卡:(4)哈马学校的学生   我昨天遇到了 Bob (5)。

在这个例子中,我想用 Bob 替换 Doka(1,2,5)。替换匹配的条件是:

  1. 不在双引号内。
  2. 不在回车和冒号之间。
  3. 我该怎么做?

1 个答案:

答案 0 :(得分:1)

您可以使用此正则表达式和代码,前提是任何双引号都已正确关闭,即它们出现偶数次:

var str = `Doka (1) is 20 years old. Doka, (2) Sole are my friends. Sole told me "Doka (3) is a nice gỉrl!"
Doka: (4) student of Hamma school.
I met Doka (5) yesterday.`;

str = str.replace(/(([^\n\r])Doka|Doka(?!:))(?=([^"]*"[^"]*")*[^"]*$)/g, '$2Bob');

console.log(str);

说明:

  • ([^\n\r])Doka:匹配“Doka”及其前面的字符,前提是此前一个字符不是换行符(即既不是换行符也不是回车符)。该字符在一组(括号)中捕获,因此我们可以在替换期间恢复它。

  • |Doka(?!:):如果上述内容不匹配,则会尝试此替代方案。当没有任何前面的字符(即“Doka”出现在最开始时),或者在它之前有换行符时,就会发生这种情况。在这种情况下,我们只允许匹配“Doka”后面没有冒号。

将上述两个表达式放在另一组括号中,以设置OR(|)运算的边界。这成为第一个捕获组。

  • (?=([^"]*"[^"]*")*[^"]*$):这要求潜在匹配后跟一个偶数引号,直到字符串的最后($)。这归结为要求匹配不包含在双引号中。

替换字符串$2Bob恢复第二个捕获组(由[^\n\r]匹配的内容,可能一无所有),然后插入“Bob”。