匹配除第一个字符之外的所有字符实例,不向后看

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