Замена текста по маске
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.143] |
|
|
правила раздела Алгоритмы

Замена текста по маске
|
Сообщ.
#1
,
|
|
|
|
Добрый день, подскажите плз.
функцию либо алгоритм замены текста в строке по маске(?*) типа: function StringMaskReplace(Text,MaskSubStr,NewSubStr:string):string; StringMaskReplace("Тут был Вася","? Вася*","ли Вася и Петя") =>"Тут были Вася и Петя" Зызб) |
|
Сообщ.
#2
,
|
|
|
|
TRegExpr library
Добавлено Пример: ![]() ![]() 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-овскому '*'. Подробнее смотри на том же сайте: Синтаксис |
|
Сообщ.
#3
,
|
|
|
|
Спасибо за раскрытый ответ, но в TRegExpr мне эти точки не очень нравятся, сбивается логика, да и к тому же в некоторых случаях она нарушена, может ошибаюсь но вот к примеру:
В "Exele" из "9.99" вычитываю "9." выходит: "99" В TRegExpr: StrReplaceRegex(const s,mask,replace: string): string; StrReplaceRegex("9.99","9.","")=>"" - удаляет все! Имеется ввиду, если в маске существуют точка(и), то TRegExpr воспринимает ее как спецсимвол а не как точку! |
|
Сообщ.
#4
,
|
|
|
|
. => \.
|
|
Сообщ.
#5
,
|
|
|
|
Тогда возможен другой недочет:
При вычете в строке "9\.99" текста по маске "9\." выходит: "9\.99" - т.е. ничего не выходит! |
|
Сообщ.
#6
,
|
|
|
|
Может все-таки документацию почитаешь?
\. => \\\. |
|
Сообщ.
#7
,
|
|
|
|
Имели ввиду "\. => \\." ?
ну а смысл, все равно эти замены невозможно учесть, т.к. в искомом для замены тексте, могут быть и маски и текст! а различить в подобном случае(по сабжу) невозможно! Разве что, если б переменная 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]); то будет выходить нормальный результат) ЗЫ: Но все же, если что, сообщу... ЗЗЫ: И Вы тоже, если найдете готовый алгоритм, сообщите плз... |