Javascript 匹配除第一个实例外的所有角色实例,无需查找

Javascript 匹配除第一个实例外的所有角色实例,无需查找,javascript,regex,safari,lookbehind,Javascript,Regex,Safari,Lookbehind,我正在努力解决这个简单的正则表达式在Safari中无法正常工作的问题: (?在问号第一次出现之前,您可以使用替换捕获。在替换中再次使用该组,使其保持不变 在替换的第二部分,匹配要替换的问号 const regex=/^([^?]*\?)\?/g; const s=“测试?测试?测试?测试/”; log(s.replace(regex,(m,g1)=>g1?g1:“[replace]”);lookbehind总是有替代方法的。 在这种情况下,您只需替换字符(序列)的所有实例,第一个实例除外 该方

我正在努力解决这个简单的正则表达式在Safari中无法正常工作的问题:


(?在问号第一次出现之前,您可以使用替换捕获。在替换中再次使用该组,使其保持不变

在替换的第二部分,匹配要替换的问号

const regex=/^([^?]*\?)\?/g;
const s=“测试?测试?测试?测试/”;

log(s.replace(regex,(m,g1)=>g1?g1:“[replace]”);
lookbehind总是有替代方法的。 在这种情况下,您只需替换字符(序列)的所有实例,第一个实例除外

该方法接受函数作为第二个参数。 该函数接收完整匹配、每个捕获组匹配(如果有)、匹配的偏移量以及其他一些参数。
.indexOf
可以报告匹配的第一个偏移量。 或者,
.search
也可以报告匹配的第一个偏移量,但可以使用正则表达式

可以在函数内部比较这两个偏移:

const yourString=“你好?世界?什么?谁?”, 您的替代品=“!”, 模式=/\?/g, patternString=“?”, firstMatchOffsetIndexOf=yourString.indexOf(patternString), firstMatchOffsetSearch=yourString.search(模式); console.log(yourString.replace(模式,(匹配,偏移量)=>{ if(偏移量!==firstMatchOffsetIndexOf){ 归还你的替代品; } 复赛; })); console.log(yourString.replace(模式,(匹配,偏移量)=>{ if(偏移量!==firstMatchOffsetSearch){ 归还你的替代品; } 复赛; }));
拆分并与

var s=“一、二、三、四”
var l=s.split(“?”//split with?
var first=l.shift()//获取第一项并从l中删除

console.log(first+“?”+l.join(“”)//生成结果
你想对匹配项做什么?替换它们?这是一个X/Y问题是的,我只想替换它们聪明…但它只对单个字符有效,对吗?
[^?]
不能用于字符序列。可能,它可以以某种方式替换为先行。@SebastianSimon它重复一个字符而不是
是否要排除其他字符?“它重复一个字符而不是
” — 是的,这就是
[^?]*
所做的……但我担心的是,如果OP想要替换例如每个序列
abc
,除了第一个,那么
[^abc]*
就没有意义了,即“
[^?]
不能用于字符序列”。它看起来像
常量regex=/^(.*?)|\?/g;
的工作方式完全相同,但现在它可以扩展为
/^(.*abc)\abc/g
@BartekSłysz在这种情况下,您可以使用RegExp构造函数,如
const param=“?”;const regex=new RegExp(`^([^${param}]*\${param})\\${param},'g'))
收到了,接受了,并注意到了!马克。谢谢你提供了大量有价值的建议:)