Здравствуйте Уважаемые форумчане. Если не трудно, может кто объяснить в краце как работают регулярные выражения,и помогут ли мне они в решении моей задачи Всё дело в том ,что есть некоторая стока типа (3,"Name","ColorName","OldName",15,size) из которой нужно выцепить значения без скобок,кавычек,и запятых ...Решал как то эту проблему на BCB 6 с помощью класса TList , а сейчас хотелось бы решить тоже самое но на ASM Если есть у кого нибудь мысли или советы по этой теме буду очень признателен. Спасибо за внимание.
Простите,имелось в виду не как использовать а ка вообще работает поиск по шаблону , посимвольно или кусками.
По поводу RegEXP разобрались,а как бы в решили подобную задачу ? с помощью поиска и замены разделительных знаков ?
как по мне,алгос примерно такой сначало вытягиваем строки между запятыми: сохр.позицию первого символа запятой(start),далее передвигаемся по строке до следущего символа,запоминаем позицию(last) вызываем lstrcpyn(buf,str+start,last-start+1), и так далее, только уже ищем с позиции start=start+last .. а скобки можно вообще потом тупо удалить
зы. если не знаешь как реализовать на асме, то сделай кодес ЯВУ, после чего под дебагером глянь как все устроено))
та боже, перебираем символы, как только находим букву-цифру это старт, находим разделитель(кавычка,запятая)это конец. делаем alloc(end-start+1). копируем туда данные. и так до конца. учитывая что формат и все остальное заранее известны, это элементарно. блин ребята зачем вы вообще начинаете заниматся програмингом если вам лень придумать алгоритм для решения такой примитивной задачи? неужели не интересно сделать это самому?
Да почему не интересно, просто хотел узнать как бы решили эту задачу другие люди...ведь все познаётся в сравнении... у меня решение такое : Задать некий шаблон типа " (s,"s",s,s,s,"s") " где s означает взять слово. А потом просто перебираем строку одновремено сравнивая с шаблоном на С++ это выглядело бы так,функция корявая ибо на скорую руку накавырял... Код (Text): int __fastcall TForm1::AnalysisLine(String sTemplate,String sBuff) { enum {read,take}tmode; int sLength=sBuff.Length(),itakeNum=0; int iTemplLength=sTemplate.Length();String Lex; for(int i=1,itmpNum=1;i<=sLength;i++) { if(sBuff[i]==sTemplate[itmpNum]) { if(tmode==take) { if(itakeNum<scriptMAXIMUM) { alArrayCommands[itakeNum]=Lex.Trim(); itakeNum++; }tmode=read;Lex=""; } if(itmpNum<iTemplLength)itmpNum++; if(sTemplate[itmpNum]=='s') { tmode=take;itmpNum++; } }else if(tmode==take)Lex+=sBuff[i]; }return(itakeNum); }//---------------------------------------------------------------------------- В итоге мы имеем только то что нужно,без всякого мусора типа разделительных знаков. P.S. Дело в том что шаблонов будет много и они разные... вот и хотел узнать кто и что мог предложить по этому поводу.
Есть хорошая програмка RegexCoach. В частности в ней можно писать регулярные выражения (естественно нужно знать теорию) и там же она обрабатывает их в релтайме. Дополнительно показывает дерево разбора регулярного выражения. Возможно поможет подсмотреть как оно срабатывает на сравниваемой строке изнутри.
Просто такая задача - это азбука и даже в новичках ее стыдно задавать. Можно только в "для лабораторных работ".... А шаблон - это из пушки по воробьям. Алгоритм решения твоей задачи действительно заложен в regexp, но полезнее раскопать реализацию regexp, чем готовеньким решать несвойственную задачу.
Ну алгоритм надо ещё "раскапать" + разобраться в нем,и сделать свою версию. А RegExp это вроде как из ядерного орудия по воробьям ! =) Мне кажется затея с шаблонами достаточно гибкая для моих задач,посмотрим в общем,если не найду реализацию RegExp то придется мутить с шаблонами Спасибо за внимание.
GGCom тема про регекспы поднимается достаточно часто. и уже в который раз ссылю страничку посвященную небольшим алгосам и достаточно простой имплементации регехпов из п9. если вам тяжело житать на ене, то у нас тут есть критик один, прекрасно знающий ен и обожающий критиковать чужие переводы. он, думается, желает осчасливить страждущих нееноязычных безукоризненным переводом от себя. попросите его. авось снизойдет до вас со своего критического олимпа.