как работают Регулярные выражения

Discussion in 'WASM.BEGINNERS' started by GGCom, Jan 9, 2010.

  1. GGCom

    GGCom New Member

    Blog Posts:
    0
    Здравствуйте Уважаемые форумчане.

    Если не трудно, может кто объяснить в краце как работают регулярные выражения,и помогут ли мне они в решении моей задачи

    Всё дело в том ,что есть некоторая стока типа (3,"Name","ColorName","OldName",15,size) из которой нужно выцепить значения без скобок,кавычек,и запятых ...Решал как то эту проблему на BCB 6 с помощью класса TList , а сейчас хотелось бы решить тоже самое но на ASM

    Если есть у кого нибудь мысли или советы по этой теме буду очень признателен.
    Спасибо за внимание.
     
  2. GGCom

    GGCom New Member

    Blog Posts:
    0
    Простите,имелось в виду не как использовать а ка вообще работает поиск по шаблону , посимвольно или кусками.
     
  3. djmans

    djmans New Member

    Blog Posts:
    0
    слишком простая задача, чтобы задействовать regexp.
     
  4. GGCom

    GGCom New Member

    Blog Posts:
    0
    По поводу RegEXP разобрались,а как бы в решили подобную задачу ? с помощью поиска и замены разделительных знаков ?
     
  5. ptr

    ptr New Member

    Blog Posts:
    0
    как по мне,алгос примерно такой
    сначало вытягиваем строки между запятыми: сохр.позицию первого символа запятой(start),далее передвигаемся по строке до следущего символа,запоминаем позицию(last) вызываем lstrcpyn(buf,str+start,last-start+1), и так далее, только уже ищем с позиции start=start+last ..
    а скобки можно вообще потом тупо удалить :)
     
  6. ptr

    ptr New Member

    Blog Posts:
    0
    зы. если не знаешь как реализовать на асме, то сделай кодес ЯВУ, после чего под дебагером глянь как все устроено))
     
  7. onSide

    onSide New Member

    Blog Posts:
    0
    та боже, перебираем символы, как только находим букву-цифру это старт, находим разделитель(кавычка,запятая)это конец. делаем alloc(end-start+1). копируем туда данные. и так до конца. учитывая что формат и все остальное заранее известны, это элементарно.
    блин ребята зачем вы вообще начинаете заниматся програмингом если вам лень придумать алгоритм для решения такой примитивной задачи? неужели не интересно сделать это самому?
     
  8. Partner

    Partner Павел

    Blog Posts:
    0
    Ме-е-е-дленно.
     
  9. GGCom

    GGCom New Member

    Blog Posts:
    0
    Да почему не интересно, просто хотел узнать как бы решили эту задачу другие люди...ведь все познаётся в сравнении... у меня решение такое :

    Задать некий шаблон типа " (s,"s",s,s,s,"s") " где s означает взять слово.
    А потом просто перебираем строку одновремено сравнивая с шаблоном на С++ это выглядело бы так,функция корявая ибо на скорую руку накавырял...

    Code (Text):
    1. int  __fastcall TForm1::AnalysisLine(String sTemplate,String sBuff)
    2. { enum {read,take}tmode;
    3.   int sLength=sBuff.Length(),itakeNum=0;
    4.   int iTemplLength=sTemplate.Length();String Lex;
    5.   for(int i=1,itmpNum=1;i<=sLength;i++)
    6.   {   if(sBuff[i]==sTemplate[itmpNum])
    7.       {  if(tmode==take)
    8.          {  if(itakeNum<scriptMAXIMUM)
    9.             {  alArrayCommands[itakeNum]=Lex.Trim();
    10.                itakeNum++;
    11.             }tmode=read;Lex="";
    12.          }
    13.          if(itmpNum<iTemplLength)itmpNum++;
    14.          if(sTemplate[itmpNum]=='s')
    15.          {  tmode=take;itmpNum++;
    16.          }
    17.       }else if(tmode==take)Lex+=sBuff[i];
    18.   }return(itakeNum);
    19. }//----------------------------------------------------------------------------
    В итоге мы имеем только то что нужно,без всякого мусора типа разделительных знаков.
    P.S. Дело в том что шаблонов будет много и они разные... вот и хотел узнать кто и что мог предложить по этому поводу.
     
  10. keYMax

    keYMax New Member

    Blog Posts:
    0
    Есть хорошая програмка RegexCoach. В частности в ней можно писать регулярные выражения (естественно нужно знать теорию) и там же она обрабатывает их в релтайме. Дополнительно показывает дерево разбора регулярного выражения. Возможно поможет подсмотреть как оно срабатывает на сравниваемой строке изнутри.
     
  11. GGCom

    GGCom New Member

    Blog Posts:
    0
    Спасибо,пойду смотреть !
     
  12. valterg

    valterg Active Member

    Blog Posts:
    0
    Просто такая задача - это азбука и даже в новичках ее стыдно задавать. Можно только в "для лабораторных работ".... А шаблон - это из пушки по воробьям. Алгоритм решения твоей задачи действительно заложен в regexp, но полезнее раскопать реализацию regexp, чем готовеньким решать несвойственную задачу.
     
  13. GGCom

    GGCom New Member

    Blog Posts:
    0
    Ну алгоритм надо ещё "раскапать" + разобраться в нем,и сделать свою версию.

    А RegExp это вроде как из ядерного орудия по воробьям ! =)

    Мне кажется затея с шаблонами достаточно гибкая для моих задач,посмотрим в общем,если не найду реализацию RegExp то придется мутить с шаблонами
    Спасибо за внимание.
     
  14. qqwe

    qqwe New Member

    Blog Posts:
    0
    GGCom
    тема про регекспы поднимается достаточно часто. и уже в который раз ссылю страничку посвященную небольшим алгосам и достаточно простой имплементации регехпов из п9.

    если вам тяжело житать на ене, то у нас тут есть критик один, прекрасно знающий ен и обожающий критиковать чужие переводы.
    он, думается, желает осчасливить страждущих нееноязычных безукоризненным переводом от себя. попросите его. авось снизойдет до вас со своего критического олимпа.
     
  15. qqwe

    qqwe New Member

    Blog Posts:
    0
    вообщето либ много. например "pcre".
     
  16. GGCom

    GGCom New Member

    Blog Posts:
    0
    Большое спасибо за ссылку!