我想在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)。替换匹配的条件是:
我该怎么做?
答案 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”。