Habe noch ein bisschen gespielt. Vielleicht hilft es ja irgendwann mal jemandem.
Dies ist die Kombination beider Varianten.
Diese Funktion entfernt alle Zeichen, die NICHT entweder Satz- oder Leerzeichen sind oder auf der Seite "Mathematical Operators" stehen.
Also aus 'bla,. blabla 1234 ∉∑∰≷≼⊑⋸⋶ b брый день' wird ',. ∉∑∰≷≼⊑⋸⋶ ' extrahiert.
Das kann man natürlich beliebig "weiterspinnen".
Code: Alles auswählen
uses LazUTF8, LCLUnicodeData, character, unicodedata;
function MathOpOnly(const AUTF8String: string): string;
const
MY_CATEGORIES = [TUnicodeCategory.ucConnectPunctuation,
TUnicodeCategory.ucDashPunctuation, TUnicodeCategory.ucOpenPunctuation,
TUnicodeCategory.ucClosePunctuation, TUnicodeCategory.ucInitialPunctuation,
TUnicodeCategory.ucFinalPunctuation, TUnicodeCategory.ucOtherPunctuation,
TUnicodeCategory.ucSpaceSeparator, TUnicodeCategory.ucLineSeparator,
TUnicodeCategory.ucParagraphSeparator];
var
p: pchar;
CharLen: integer;
Cpc: cardinal;
BlockIdx: integer;
begin
Result := EmptyStr;
p := PChar(AUTF8String);
repeat
Cpc := UTF8CodepointToUnicode(p, CharLen);
if TUnicodeCategory(GetProps(Cpc)^.Category) in MY_CATEGORIES then
Result := Result + UnicodeToUTF8(Cpc)
else
for BlockIdx := Low(UnicodeBlocks) to High(UnicodeBlocks) do
if (UnicodeBlocks[BlockIdx].S <= Cpc) and (UnicodeBlocks[BlockIdx].E >= Cpc) then
//Hier Filter:
if UnicodeBlocks[BlockIdx].PG = 'Mathematical Operators' then
Result := Result + UnicodeToUTF8(Cpc);
Inc(p, CharLen);
until (CharLen = 0) or (Cpc = 0);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := MathOpOnly('bla,. blabla 1234 ∉∑∰≷≼⊑⋸⋶ b брый день');
end;