什么是 JS 中的 lookbehind 支持?如何更换?
What is lookbehind support in JS? How to replace it?
我有一个字符串,我想用任何其他 i 替换每个不是 following/followed 的 'i',并将其替换为“z”。我知道有消极的前瞻和后视。
结果应该是:
i => z
iki => zkz
iiki => iikz
ii => ii
iii => iii
我试过用这个:
/(?<!i)i(?!i)/gi
它失败并抛出错误:Invalid regex group
。
还
/i(?!i)/gi
工作正常,但与第二个 "i" 匹配:"ii".
还有其他方法吗?
JS支持lookbehind是什么意思?
JavaScript 正则表达式中的回顾是相当新的。在撰写本文时,它是 only supported in V8(在 Chrome、Chromium、Brave...中),而不是其他引擎。
有many questions with answers here about how to work around not having lookbehind, such as this one.
Steven Levithan 的 This article 还展示了解决该功能缺失的方法。
I want to replace every 'i' that is NOT following/followed by any other i and replace it with 'z`
无需先行或后行,使用占位符和捕获组即可轻松做到这一点。您可以捕获 i
:
之后的内容
const rex = /i(i+|.|$)/g;
...如果捕获的不是 i
或一系列 i
,则有条件地替换它:
const result = input.replace(rex, (m, c) => {
return c[0] === "i" ? m : "z" + c;
});
实例:
const rex = /i(i+|.|$)/g;
function test(input, expect) {
const result = input.replace(rex, (m, c) => {
return c[0] === "i" ? m : "z" + c;
});
console.log(input, result, result === expect ? "Good" : "ERROR");
}
test("i", "z");
test("iki", "zkz");
test("iiki", "iikz");
test("ii", "ii");
test("iii", "iii");
在你的情况下你真的不需要回顾:
'iiki'.replace(/i+/g, (m0) => m0.length > 1 ? m0 : 'z')
你可以只用一个函数作为替换部分,测试匹配字符串的长度。
这是你所有的测试用例:
function test(input, expect) {
const result = input.replace(/i+/g, (m0) => m0.length > 1 ? m0 : 'z');
console.log(input + " => " + result + " // " + (result === expect ? "Good" : "ERROR"));
}
test('i', 'z');
test('iki', 'zkz');
test('iiki', 'iikz');
test('ii', 'ii');
test('iii', 'iii');
在这种情况下,您可以使用一种技巧。正在根据匹配更改偏移值。
let arr = ['i','iki','iiki','ii','iii', 'ki']
arr.forEach(e=>{
let value = e.replace(/i(?!i)/g, function(match,offset,string){
return offset > 0 && string[offset-1] === 'i' ? 'i' : 'z'
})
console.log(value)
})
我有一个字符串,我想用任何其他 i 替换每个不是 following/followed 的 'i',并将其替换为“z”。我知道有消极的前瞻和后视。
结果应该是:
i => z
iki => zkz
iiki => iikz
ii => ii
iii => iii
我试过用这个:
/(?<!i)i(?!i)/gi
它失败并抛出错误:Invalid regex group
。
还
/i(?!i)/gi
工作正常,但与第二个 "i" 匹配:"ii".
还有其他方法吗?
JS支持lookbehind是什么意思?
JavaScript 正则表达式中的回顾是相当新的。在撰写本文时,它是 only supported in V8(在 Chrome、Chromium、Brave...中),而不是其他引擎。
有many questions with answers here about how to work around not having lookbehind, such as this one.
Steven Levithan 的This article 还展示了解决该功能缺失的方法。
I want to replace every 'i' that is NOT following/followed by any other i and replace it with 'z`
无需先行或后行,使用占位符和捕获组即可轻松做到这一点。您可以捕获 i
:
const rex = /i(i+|.|$)/g;
...如果捕获的不是 i
或一系列 i
,则有条件地替换它:
const result = input.replace(rex, (m, c) => {
return c[0] === "i" ? m : "z" + c;
});
实例:
const rex = /i(i+|.|$)/g;
function test(input, expect) {
const result = input.replace(rex, (m, c) => {
return c[0] === "i" ? m : "z" + c;
});
console.log(input, result, result === expect ? "Good" : "ERROR");
}
test("i", "z");
test("iki", "zkz");
test("iiki", "iikz");
test("ii", "ii");
test("iii", "iii");
在你的情况下你真的不需要回顾:
'iiki'.replace(/i+/g, (m0) => m0.length > 1 ? m0 : 'z')
你可以只用一个函数作为替换部分,测试匹配字符串的长度。
这是你所有的测试用例:
function test(input, expect) {
const result = input.replace(/i+/g, (m0) => m0.length > 1 ? m0 : 'z');
console.log(input + " => " + result + " // " + (result === expect ? "Good" : "ERROR"));
}
test('i', 'z');
test('iki', 'zkz');
test('iiki', 'iikz');
test('ii', 'ii');
test('iii', 'iii');
在这种情况下,您可以使用一种技巧。正在根据匹配更改偏移值。
let arr = ['i','iki','iiki','ii','iii', 'ki']
arr.forEach(e=>{
let value = e.replace(/i(?!i)/g, function(match,offset,string){
return offset > 0 && string[offset-1] === 'i' ? 'i' : 'z'
})
console.log(value)
})