На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! правила раздела Алгоритмы
1. Помните, что название темы должно хоть как-то отражать ее содержимое (не создавайте темы с заголовком ПОМОГИТЕ, HELP и т.д.). Злоупотребление заглавными буквами в заголовках тем ЗАПРЕЩЕНО.
2. При создании темы постарайтесь, как можно более точно описать проблему, а не ограничиваться общими понятиями и определениями.
3. Приводимые фрагменты исходного кода старайтесь выделять тегами code.../code
4. Помните, чем подробнее Вы опишете свою проблему, тем быстрее получите вразумительный совет
5. Запрещено поднимать неактуальные темы (ПРИМЕР: запрещено отвечать на вопрос из серии "срочно надо", заданный в 2003 году)
6. И не забывайте о кнопочках TRANSLIT и РУССКАЯ КЛАВИАТУРА, если не можете писать в русской раскладке :)
Модераторы: Akina, shadeofgray
  
> Замена текста по маске
    Добрый день, подскажите плз.
    функцию либо алгоритм замены текста в строке по маске(?*)

    типа:
    function StringMaskReplace(Text,MaskSubStr,NewSubStr:string):string;

    StringMaskReplace("Тут был Вася","? Вася*","ли Вася и Петя")
    =>"Тут были Вася и Петя"

    Зызб)
    Сообщение отредактировано: Krants -
      TRegExpr library

      Добавлено
      Пример:
      ExpandedWrap disabled
        uses
          regexpr;
         
        function StrReplaceRegex(const s,mask,replace: string): string;
        var
          regex: TRegExpr;
        begin
          regex := TRegExpr.Create;
          regex.Expression := mask;
          result := regex.Replace(s,replace);
          regex.free;
        end;
         
         
        procedure TForm1.Button1Click(Sender: TObject);
        begin
          ShowMessage(StrReplaceRegex('Тут был Вася!','. Вася.*','ли Вася и Петя'));
        end;


      Добавлено
      Точка ('.') соответсует wildcard'у '?', а если после символа стоит звёздочка ('*'), значит он может повторяться любое количество раз, т.е. regex'овское '.?' эквивалентно DOS-овскому '*'. Подробнее смотри на том же сайте: Синтаксис
        Спасибо за раскрытый ответ, но в TRegExpr мне эти точки не очень нравятся, сбивается логика, да и к тому же в некоторых случаях она нарушена, может ошибаюсь но вот к примеру:
        В "Exele" из "9.99" вычитываю "9." выходит: "99"
        В TRegExpr:
        StrReplaceRegex(const s,mask,replace: string): string;
        StrReplaceRegex("9.99","9.","")=>"" - удаляет все!
        Имеется ввиду, если в маске существуют точка(и), то TRegExpr воспринимает ее как спецсимвол а не как точку!
          . => \.
            Тогда возможен другой недочет:
            При вычете в строке "9\.99" текста по маске "9\." выходит: "9\.99" - т.е. ничего не выходит!
              Может все-таки документацию почитаешь? :angry:

              \. => \\\.
                Имели ввиду "\. => \\." ?
                ну а смысл, все равно эти замены невозможно учесть, т.к. в искомом для замены тексте, могут быть и маски и текст!
                а различить в подобном случае(по сабжу) невозможно!
                Разве что, если б переменная mask имела бы тип, типа записи:
                TList=record
                Substr:array of string;
                Mask:array of boolean;
                Text:string;
                ...
                end;

                где Text:=Substr[0]+..+Substr[n];
                а массив Mask говорил бы где Sumstr маска а где текст.
                И только тогда-бы логика замены была актуальна для любых вариантов набора сиволов!

                Добавлено
                >>Soul :)
                Хотя..., примите плз извенения, за поспешные выводы...
                Просто жара-лето, как-то недумается)
                Если хорошенько подготовить строку mask перед заменой, типа:
                op:= mask;
                op:=StringReplace(op,'\','\\',[rfReplaceAll]);
                op:=StringReplace(op,'+','\+',[rfReplaceAll]);
                op:=StringReplace(op,'[','\[',[rfReplaceAll]);
                op:=StringReplace(op,'.','\.',[rfReplaceAll]);
                ...
                op:=StringReplace(op,'?','.',[rfReplaceAll]);
                op:=StringReplace(op,'*','.*',[rfReplaceAll]);
                то будет выходить нормальный результат)

                ЗЫ: Но все же, если что, сообщу...
                ЗЗЫ: И Вы тоже, если найдете готовый алгоритм, сообщите плз...
                Сообщение отредактировано: Krants -
                0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                0 пользователей:


                Рейтинг@Mail.ru
                [ Script execution time: 0.0739 ]   [ 15 queries used ]   [ Generated: 21.07.26, 12:04 GMT ]