Javascript 匹配除第一个实例外的所有角色实例,无需查找
我正在努力解决这个简单的正则表达式在Safari中无法正常工作的问题: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总是有替代方法的。 在这种情况下,您只需替换字符(序列)的所有实例,第一个实例除外 该方
(?在问号第一次出现之前,您可以使用替换捕获。在替换中再次使用该组,使其保持不变
在替换的第二部分,匹配要替换的问号
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'))
收到了,接受了,并注意到了!马克。谢谢你提供了大量有价值的建议:)