Delphi: Есть ли какие-либо функции StringReplaceW или WideStringReplace? - PullRequest
0 голосов
/ 06 апреля 2010

Существуют ли какие-либо реализации манипуляций с широкими строками?

function WideUpperCase(const S: WideString): WideString;

function WidePos(Substr: WideString; S: WideString): Integer;

function StringReplaceW(const S, OldPattern, NewPattern: WideString; 
      Flags: TReplaceFlags): WideString;

etc

Ответы [ 3 ]

4 голосов
/ 06 апреля 2010

Проект JEDI включает JclUnicode.pas, который имеет WideUpperCase и WidePos, но не StringReplace. Код SysUtils.pas StringReplace не очень сложен, поэтому вы можете легко скопировать его и заменить строку на WideString, AnsiPos на WidePos и ​​AnsiUpperCase на WideUpperCase и получить что-то функциональное, если медленно.

2 голосов
/ 06 апреля 2010

Обычно я импортирую библиотеку типов «Microsoft VBScript Regular Expression 5.5» и использую объекты IRegExp.

OP Edit

мне нравится этот ответ, и я пошел дальше и написал StringReplaceW функцию, используя RegEx:

function StringReplaceW(const S, OldPattern, NewPattern: WideString; Flags: TReplaceFlags): WideString;
var
    objRegExp: OleVariant;
    Pattern: WideString;
    i: Integer;
begin
    {
        Convert the OldPattern string into a series of unicode points to match
        \uxxxx\uxxxx\uxxxx

            \uxxxx  Matches the ASCII character expressed by the UNICODE xxxx.
                        "\u00A3" matches "£".
    }
    Pattern := '';
    for i := 1 to Length(OldPattern) do
        Pattern := Pattern+'\u'+IntToHex(Ord(OldPattern[i]), 4);

    objRegExp := CreateOleObject('VBScript.RegExp');
    try
        objRegExp.Pattern := Pattern;
        objRegExp.IgnoreCase := (rfIgnoreCase in Flags);
        objRegExp.Global := (rfReplaceAll in Flags);

        Result := objRegExp.Replace(S, NewPattern);
    finally
        objRegExp := Null;
    end;
end;
2 голосов
/ 06 апреля 2010

TntControls имеет набор широкоформатных функций.

...