Как-нибудь так. Не очень эффективно, правда. И без скобок.
static string FindReg(string src,string ptrn) {
int LP=ptrn.Length,LS=src.Length;
for(int i=0;i<LS;i++) {
int k=i;
bool ok=true;
for(int j=0;ok && j<LP;) {
int m=1;
bool plus=false;
char cur=ptrn[j++];
for(;j<LP;j++) {
if(ptrn[j]=='+') plus=true;
else if(ptrn[j]==cur) m++;
else break;
}
int s=0;
while(k+s<LS && src[k+s]==cur) s++;
if(s<m) {
ok=false; break;
} else if(plus) k+=s;
else k+=m;
}
if(ok) return src.Substring(i,k-i);
}
return null;
}
Но вообще, конечный автомат понадобится очень быстро. Уже для какого-нибудь a*b*ac без него трудно будет обойтись (если не писать страшную рекурсию).