Zeichenfolgen nach Zeichentyp aufteilen

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Zeichenfolgen nach Zeichentyp aufteilen

Post by Meister Lampe » 21 Jun 2022, 16:11

Hallo zusammen!

Wie kann ich ich Zeichenfolgen nach ihrem Typ aufteilen? Daß ich also aus "123abc" dadurch var1 := 123 und var2 := abc erhalte.
Mit StrSplit() kann ich Zeichenketten zwar teilen, aber nur anhand gegebener Zeichen, die dazwischen liegen, die Zeichentypen kann ich aber nicht erkennen. Ähnliches gilt für FundPos sowie alle anderen String-Suchfunktionen.

Viele Grüße von Meister Lampe
Last edited by Meister Lampe on 22 Jun 2022, 16:28, edited 1 time in total.

KHA
Posts: 401
Joined: 21 Aug 2018, 11:11

Re: Zeichenfolgen nach Zeichentyp aufteilen

Post by KHA » 21 Jun 2022, 17:45

vlt. so:

Code: Select all

var := "123abc"
RegExMatch(var, "i)(\d+)([a-zäöüß]+)", m)
MsgBox,% Zahlen := m1
MsgBox,% Buchstaben := m2

User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Zeichenfolgen nach Zeichentyp aufteilen

Post by Meister Lampe » 22 Jun 2022, 16:26

Hallo KHA!

Vielen Dank erstmal für den Code.
Allerdings ist das noch nicht ganz das, was ich mir vorgestellt hatte. Wenn z.B. jetzt erst Buchstaben kommen und dann die Zahlen, also "abc123", dann erhalte ich nur leere Variablen bzw. Msg-Boxen. Da ich den Code in ein größeres Script einbauen möchte, sollen die Variablen dann weiterverwendet werden können.
Hier ist mein auf dem Deinen aufgebauter Code:

Code: Select all

^F5::
alteZwischenablage := ClipboardAll
	Clipboard := ""
	Send, ^c
	ClipWait, 1, 1

RegExMatch(Clipboard, "i)(\d+)([a-zäöüß]+)", m)
v_Zahlen := m1
v_Buchstaben := m2
Send, {Enter} %v_Zahlen% {Enter} %v_Buchstaben%

Clipboard := alteZwischenablage
return
Dabei dient die Sache mit dem Clipboard und dem Send dazu, daß man das besser auf einem Word-Blatt ausprobieren kann.
Im Script selber wird die Variable später aus einem Textfeld genommen.

Viele Grüße von Meister Lampe

KHA
Posts: 401
Joined: 21 Aug 2018, 11:11

Re: Zeichenfolgen nach Zeichentyp aufteilen

Post by KHA » 22 Jun 2022, 16:37

Alternative:

Code: Select all

var := "klm321kdf123xyz5ß8461öü"

SplitTyp :=  TypSplit(var)

MsgBox,0, % "Treffer: " SplitTyp.MaxIndex(), % "Es gab " SplitTyp.MaxIndex() " treffer!"

Loop, % SplitTyp.MaxIndex()
     MsgBox,% SplitTyp[A_index]


TypSplit(Str){
TrefferArray := []
SuchMuster := "i)(\d+)|([a-zäöüß]+)"

While Pos := RegExMatch(Str, SuchMuster, M, A_Index = 1 ? 1 : Pos + StrLen(M))
     (M1 != "") ? TrefferArray.Push(M1) : TrefferArray.Push(M2)

Return, % TrefferArray
}

just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Zeichenfolgen nach Zeichentyp aufteilen

Post by just me » 23 Jun 2022, 01:29

Moin @Meister Lampe,

es handelt sich also immer um genau eine Buchstabengruppe gefolgt von genau einer Zifferngruppe bzw. umgekehrt? Andere Zeichen kommen nie vor?

User avatar
Meister Lampe
Posts: 228
Joined: 06 Apr 2014, 13:28

Re: Zeichenfolgen nach Zeichentyp aufteilen

Post by Meister Lampe » 23 Jun 2022, 16:11

Hallo KHA & just me!

So kompliziert hatte ich mir das eigentlich nicht vorgestellt.
Ich wollte zuerst nur mal wissen, ob es eine Funktion gibt, die Zeichentypen, insbesondere char und integer erkennen kann, damit man eine Zeichenkette danach zerlegen kann.
Hintergrund ist die Möglichkeit mehrere Informationen in einem Eingabefeld der Gui unterbringen zu können, Beispiel:
H10cm bedeutet dann: Höhe 10 cm
U20cm bedeutet: Umfang 20 cm
bei v50kmh wird das als Geschwindigkeit 50 km/h gedeutet.
Normalerweise bräuchte ich dazu drei Eingabefelder, zwischen denen ich navigieren müßte, auf diese Weise läuft das über eines. Bei den obigen Beispielen allerdings könnte man es so einrichten, daß zur die Größen, Werte und Einheiten jeweils durch Leerzeichen getrennt eingegeben werden. Bei anderen vielleicht auch. Aber weil ich nicht immer dasselbe Schema verwennden möchte, sollte die einzelnen Strings des Arrays, welches ich beim Splitten erhalte, auf ihren Zeichentyp prüfen können.

Es kann aber auch sein, daß ich derjenige bin, der sich das zu kompliziert macht... :(

Viele Grüße von Meister Lampe

just me
Posts: 9424
Joined: 02 Oct 2013, 08:51
Location: Germany

Re: Zeichenfolgen nach Zeichentyp aufteilen

Post by just me » 24 Jun 2022, 03:21

Meister Lampe wrote:Ich wollte zuerst nur mal wissen, ob es eine Funktion gibt, die Zeichentypen, insbesondere char und integer erkennen kann, damit man eine Zeichenkette danach zerlegen kann.

Die gibt es -> If Var is [not] Typ
Man muss nur beachten, dass manche Typen auch eine 'leere' Zeichenfolge als Treffer werten.

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Zeichenfolgen nach Zeichentyp aufteilen

Post by BoBo » 24 Jun 2022, 07:57

@Meister Lampe
H10cm bedeutet dann: Höhe 10 cm
U20cm bedeutet: Umfang 20 cm
bei v50kmh wird das als Geschwindigkeit 50 km/h gedeutet.
Hier würde ich jedoch anstatt dreier Eingabefelder, oder einer "Mixed"-Schreibweise zu so etwas tendieren…
DropDownList "Höhe/Breite/Tiefe/Umfang/…"
Edit-/Eingabefeld
DropDownList "mm/cm/m/…"

… was auch die Einheitenzuordnung erleichtern dürfte.

User avatar
Frosti
Posts: 426
Joined: 27 Oct 2017, 14:30
Contact:

Re: Zeichenfolgen nach Zeichentyp aufteilen

Post by Frosti » 25 Jun 2022, 08:56

Ich würde eindeutig Meister Lampes Idee bevorzugen. Erspart mir dieser doch den Wechsel zwischen Tastatur und Maus. Ein deutlicher Geschwindigkeitsvorteil gerade wenn viele Werte eingetippt werden müssen.
Bobo: Klick Scroll Klick, Klick Eingabe, Klick Scroll Klick und Klick auf Übernehmen.
Meister Lampe: Klick, Eingabe, Enter .

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Zeichenfolgen nach Zeichentyp aufteilen

Post by BoBo » 25 Jun 2022, 13:14

@Frosti - bei der Verwendung durch eine einzelne Person stimme ich dir noch zu, sobald es dann mehr als zwei sind, nicht mehr zwingend.

Warum du unterstellst, daß die Felder mittels Maus-Click anzusteuern wären, TBH no idea.

BoBo: <h><tab>10<tab><c> = 6 Zeichen
ML: <H10cm> = 5 Zeichen
BoBo: <u><tab>20<tab><c> = 6 Zeichen
ML: <U20cm> = 5 Zeichen
BoBo: <v><tab>50<tab><k> = 6 zeichen
ML: <v50kmh> = 6 Zeichen

Für mich hält sich damit der "Mehraufwand" bei der Eingabe doch reichlich in Grenzen. Stellt sich mir nun die Frage, welche Eingabenoptionen mehr Fehlermöglichlichkeiten offerieren, und wessen Validierung anschließend aufwändiger ausfällt. That's why.

User avatar
Frosti
Posts: 426
Joined: 27 Oct 2017, 14:30
Contact:

Re: Zeichenfolgen nach Zeichentyp aufteilen

Post by Frosti » 25 Jun 2022, 15:58

@BoBo - hatte Deine Idee nicht so ganz verstanden wie es mir scheint. Du nutzt die Tastatursteuerung. Es wäre zu schön, wenn ich meine Angestellten zu mehr Tastatur motivieren könnte. Sobald es was zu klicken gibt wird drauf rumgeklickt. Mein Ansatz war daher ein anderer. Deiner erscheint in der Tat weniger fehleranfällig. Ich würde jetzt beides unterbringen. Entweder man tippt, dann ändert sich die Anzeige der Dropdownfelder oder man nutzt Deine Felder und der Inhalt des Schnelleingabefeldes ändert sich mit.
So lernen auch Mausklicker die Schreibweise.

User avatar
flyingDman
Posts: 2791
Joined: 29 Sep 2013, 19:01

Re: Zeichenfolgen nach Zeichentyp aufteilen

Post by flyingDman » 25 Jun 2022, 18:01

Würde das helfen?

Code: Select all

var := "H10cm"
for x,y in strsplit(var)
	{
	lst .= (grp = 1 && y ~= "\D") OR (grp = 2 && y ~= "\d") ? y : "|" y
	grp := y ~= "\D" ? 1 : 2
	}
lst := Ltrim(lst, "|")
for x,y in strsplit(lst, "|")
	msgbox % y
14.3 & 1.3.7

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Zeichenfolgen nach Zeichentyp aufteilen

Post by BoBo » 26 Jun 2022, 03:13

@flyingDman - works great. Would you mind commenting on the regular expression part (TBH, I've no idea where 'grp' comes from)? Thx!

(Currently) my point not to favor that approach is the validation part (ie sorting out typos and other irregularities).

var := "H10cm" ; H 20 cm
var := "U50m" ; U 50 cm
var := "5U0cm" ; 5 U 0 cm
var := "U50mc" ; U 50 mc
var := "H!0cm" ; H! 0 cm

User avatar
flyingDman
Posts: 2791
Joined: 29 Sep 2013, 19:01

Re: Zeichenfolgen nach Zeichentyp aufteilen

Post by flyingDman » 26 Jun 2022, 12:17

Die Idee hier ist, jeden Charakter zu analysieren. Wenn es vom gleichen Typ wie das vorherige Zeichen ist, wird es der Liste (lst) hinzugefügt. Wenn es sich um einen anderen Typ handelt, wird es zusammen mit einer Markierung ("|", kann aber alles sein) zur Liste hinzugefügt. Dann wird die resultierende Zeichenfolge analysiert (unter Verwendung von | als Trennzeichen), um ein Array von Teilzeichenfolgen zu erstellen, die aus demselben Zeichentyp bestehen. "Typ" wird durch Regex \d oder \D definiert, aber es könnte [\d.-] und [^\d.-] sein, um - und zu berücksichtigen. damit es z. B. "H-10,5 cm" verarbeiten kann. "grp" existiert nicht (hat noch keinen Wert erhalten) in der ersten Zeile der Schleife, wenn x = 1. Daher beginnt die resultierende Zeichenfolge immer mit "|". Ltrim() kümmert sich um das Entfernen dieses anfänglichen "|". Sie erwähnten "dh das Aussortieren von Tippfehlern und anderen Unregelmäßigkeiten". Ja, das Skript kann die Gedanken des Autors nicht lesen! ... das Ergebnis von "5U0cm" ist genau wie vorhergesagt, dh "5 U 0 cm "(dasselbe für die anderen). Können Sie mir ein Skript zeigen, das feststellt, dass der Autor der Anfangszeichenfolge einen Fehler gemacht hat und beabsichtigte, H10cm anstelle von H!0cm zu schreiben?
Spoiler
14.3 & 1.3.7

BoBo
Posts: 6564
Joined: 13 May 2014, 17:15

Re: Zeichenfolgen nach Zeichentyp aufteilen

Post by BoBo » 26 Jun 2022, 15:53

Can you show me a script that determines that the author of the initial string made a mistake and intended to write H10cm instead of H!0cm?
That content isn't meant as a static value that is set within a script on purpose, but a value that has been entered within Gui's edit field.
So, 'H!0cm' might be the result of a typo bc the user hasn't released the Shift key fast enough before entering the '1' character, or swapping characters by mistake ie mc vs cm.
To determine that H!... isn't a valid setting shouldn't be the problem here as H is meant as the specified abbreviation for Höhe/height, U for Umfang/perimeter followed by a variable digit, followed by a fixed metric measurement abbreviation like cm/m/km/kmh etc. The OP wants to do some math based on the split outcome of a string like 'H10cm'.
HTH :)

PS. thx for the explanation :thumbup: that is much appreciated.

Post Reply

Return to “Ich brauche Hilfe”