匹配除第一个字符之外的所有字符实例,不向后看
Match all instances of character except the first one, without lookbehind
我正在为这个在 Safari 中无法正常工作的简单正则表达式而苦恼:
(?<=\?.*)\?
它应该匹配每个 ?
,除了第一个。
我知道 lookbehind is not working on Safari yet,但我需要找到一些解决方法。有什么建议吗?
在第一次出现问号之前,您可以使用交替捕获。在替换中再次使用该组以使其保持不变。
在交替的第二部分,匹配一个要替换的问号。
const regex = /^([^?]*\?)|\?/g;
const s = "test ? test ? test ?? test /";
console.log(s.replace(regex, (m, g1) => g1 ? g1 : "[REPLACE]"));
总是有替代回顾的方法。
在这种情况下,您需要做的就是替换字符(序列)的所有实例,第一个除外。
.replace
方法接受一个函数作为第二个参数。
该函数接收完整匹配、每个捕获组匹配(如果有)、匹配的偏移量以及其他一些参数作为参数。
.indexOf
可以报告匹配的第一个偏移量。
或者,.search
也可以报告匹配项的第一个偏移量,但适用于正则表达式。
两个偏移量可以在函数内部进行比较:
const yourString = "Hello? World? What? Who?",
yourReplacement = "!",
pattern = /\?/g,
patternString = "?",
firstMatchOffsetIndexOf = yourString.indexOf(patternString),
firstMatchOffsetSearch = yourString.search(pattern);
console.log(yourString.replace(pattern, (match, offset) => {
if(offset !== firstMatchOffsetIndexOf){
return yourReplacement;
}
return match;
}));
console.log(yourString.replace(pattern, (match, offset) => {
if(offset !== firstMatchOffsetSearch){
return yourReplacement;
}
return match;
}));
这也适用于字符 序列 :
const yourString = "Hello. Hello. Hello. Hello.",
yourReplacement = "Hi",
pattern = /Hello/g,
firstOffset = yourString.search(pattern);
console.log(yourString.replace(pattern, (match, offset) => {
if(offset !== firstOffset){
return yourReplacement;
}
return match;
}));
拆分并加入
var s = "one ? two ? three ? four"
var l = s.split("?") // Split with ?
var first = l.shift() // Get first item and remove from l
console.log(first + "?" + l.join("<REPLACED>")) // Build the results
我正在为这个在 Safari 中无法正常工作的简单正则表达式而苦恼:
(?<=\?.*)\?
它应该匹配每个 ?
,除了第一个。
我知道 lookbehind is not working on Safari yet,但我需要找到一些解决方法。有什么建议吗?
在第一次出现问号之前,您可以使用交替捕获。在替换中再次使用该组以使其保持不变。
在交替的第二部分,匹配一个要替换的问号。
const regex = /^([^?]*\?)|\?/g;
const s = "test ? test ? test ?? test /";
console.log(s.replace(regex, (m, g1) => g1 ? g1 : "[REPLACE]"));
总是有替代回顾的方法。 在这种情况下,您需要做的就是替换字符(序列)的所有实例,第一个除外。
.replace
方法接受一个函数作为第二个参数。
该函数接收完整匹配、每个捕获组匹配(如果有)、匹配的偏移量以及其他一些参数作为参数。
.indexOf
可以报告匹配的第一个偏移量。
或者,.search
也可以报告匹配项的第一个偏移量,但适用于正则表达式。
两个偏移量可以在函数内部进行比较:
const yourString = "Hello? World? What? Who?",
yourReplacement = "!",
pattern = /\?/g,
patternString = "?",
firstMatchOffsetIndexOf = yourString.indexOf(patternString),
firstMatchOffsetSearch = yourString.search(pattern);
console.log(yourString.replace(pattern, (match, offset) => {
if(offset !== firstMatchOffsetIndexOf){
return yourReplacement;
}
return match;
}));
console.log(yourString.replace(pattern, (match, offset) => {
if(offset !== firstMatchOffsetSearch){
return yourReplacement;
}
return match;
}));
这也适用于字符 序列 :
const yourString = "Hello. Hello. Hello. Hello.",
yourReplacement = "Hi",
pattern = /Hello/g,
firstOffset = yourString.search(pattern);
console.log(yourString.replace(pattern, (match, offset) => {
if(offset !== firstOffset){
return yourReplacement;
}
return match;
}));
拆分并加入
var s = "one ? two ? three ? four"
var l = s.split("?") // Split with ?
var first = l.shift() // Get first item and remove from l
console.log(first + "?" + l.join("<REPLACED>")) // Build the results