@akass
Developer

Как правильно реализовать регулярное выражение без конечных автоматов?

Пытаюсь через циклы и массивы , вот что пока получилось.
pastebin.com/Emu
На данном этапе цель реализовать хотя бы одно регулярное выражение -
"+" - от 1 и более
то есть если на входе строка аааааб , то по маске а+б , будет выдана эта строка,а если строка ацб , то пустой результат.

Встроенный класс не подходит,нужная явная реализация.
  • Вопрос задан
  • 2335 просмотров
Пригласить эксперта
Ответы на вопрос 2
@xandox
ну для начала, регулярные выражения и кончечный автомат - синонимы. По этому определись с тем, что именно ты хочешь сделать.
Ответ написан
Mrrl
@Mrrl
Заводчик кардиганов
Как-нибудь так. Не очень эффективно, правда. И без скобок.
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 без него трудно будет обойтись (если не писать страшную рекурсию).
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы