JavaScript ES6,574字节
我可能可以删除一些var
声明。
R=e=>{for(var s=0,c=[],h=/(\?|\+|\{\d*,*\d*\}|\*)(\?*)/,t=0;t<e.length;t++)switch(s){case 0:switch(e[t]){case"\\":t++,c.push("\\"+e[t]);break;case"[":j=t,s=1;break;case"(":k=t,s=2;break;default:var l=e.search(h,t);(l>=t+1||0>l)&&c.push(l==t+1?e[t]+e.slice(t,e.length).match(h)[0]:e[t])}break;case 1:"\\"==e[t]?t++:"]"==e[t]&&(c.push(e.slice(j,t+1)+(e.search(h,t)==t+1?e.slice(t,e.length).match(h)[0]:"")),s=0);break;case 2:"\\"==e[t]?t++:")"==e[t]&&(a=R(e.slice(k+1,t)),c.push("("+a+")"),s=0)}c.reverse(),r=c;var i=c.length-1;return"^"==c[i]&&(r[i]="$"),"$"==c[0]&&(r[0]="^"),r.join``}}
JS ES6,未经测试,559字节
会在家测试。
R=e=>{for(s=0,c=[],h=/(\?|\+|\{\d*,*\d*\}|\*)(\?*)/,t=0;t<e.length;t++)switch(s){case 0:switch(e[t]){case"\\":t++,c.push`\\${e[t]}`;break;case"[":j=t,s=1;break;case"(":k=t,s=2;break;default:l=e.search(h,t);(l>=t+1||0>l)&&c.push(l==t+1?e[t]+e.slice(t,e.length).match(h)[0]:e[t])}break;case 1:"\\"==e[t]?t++:"]"==e[t]&&(c.push(e.slice(j,t+1)+(e.search(h,t)==t+1?e.slice(t,e.length).match(h)[0]:"")),s=0);break;case 2:"\\"==e[t]?t++:")"==e[t]&&(a=R(e.slice(k+1,t)),c.push`(${a})`,s=0)}c.reverse(),r=c;i=c.length-1;return"^"==c[i]&&(r[i]="$"),"$"==c[0]&&(r[0]="^"),r.join``}}
JavaScript ES5,无高尔夫,961字节
function revRegex(str){
var mode = 0;
var oS = [];
var post = /(\?|\+|\{\d*,*\d*\}|\*)(\?*)/;
for(var i=0;i<str.length;i++){
switch(mode){
case 0: switch(str[i]){
case "\\": i++; oS.push("\\"+str[i]); break;
case "[": j=i; mode = 1; break;
case "(": k=i; mode = 2; break;
default:
var pLoc = str.search(post,i);
if(pLoc>=i+1||pLoc<0){ // current is not pLoc
if(pLoc==i+1){
oS.push(str[i] + str.slice(i,str.length).match(post)[0]);
} else {
oS.push(str[i]);
}
}
}; break;
case 1: if(str[i]=="\\") i++; else if(str[i]=="]"){oS.push
(str.slice(j,i+1)+(str.search(post,i)==i+1?str.slice
(i,str.length).match(post)[0]:""));mode = 0}; break;
case 2: if(str[i]=="\\") i++; else if(str[i]==")")
{a=revRegex(str.slice(k+1,i));oS.push("("+a+")");mode =
0};break;
}
}
oS.reverse();
r=oS;
var l=oS.length-1;
if(oS[l]=="^") r[l]="$";
if(oS[0]=="$") r[0]="^";
return r.join("");
}
?
要附加的。尝试输入/a(?bc)/
浏览器的控制台。