Seite 1 von 3
FindString
Verfasst: 04.07.2018 19:32
von Velindos
Hallo Leute,
Möchte im Listicon einen Eintrag wie "K1" suchen. Wenn ich
Debug FindString("K11 mit Versatz", "K1",1, #PB_String_CaseSensitive)
anwende, kommen aber auch Ergebnisse mit "K11". Natürlich wenn ich
"K1 " einsetze wäre das behoben, aber dann liest er auch nicht "K1"!
Gibt es einen anderen Weg?
Gruss ... Velindos
Re: FindString
Verfasst: 04.07.2018 20:01
von NicTheQuick
Mit RegularExpressions geht das ganz gut. Ich bin mir nur nicht sicher, ob ich mit den ReplaceString()-Zeilen alles abgedeckt habe, was als Sonderzeichen bei RegularExpressions vorkommen kann.
Code: Alles auswählen
Procedure FindStringEx(String.s, StringToFind.s, StartPosition.i = 1, Mode.i = #PB_String_CaseSensitive)
Protected flag.i = 0, pos.i
If Mode <> #PB_String_CaseSensitive
flag = #PB_RegularExpression_NoCase
EndIf
StringToFind = ReplaceString(StringToFind, "\", "\\")
StringToFind = ReplaceString(StringToFind, ".", "\.")
StringToFind = ReplaceString(StringToFind, "[", "\[")
StringToFind = ReplaceString(StringToFind, "]", "\]")
StringToFind = ReplaceString(StringToFind, "(", "\(")
StringToFind = ReplaceString(StringToFind, ")", "\)")
StringToFind = ReplaceString(StringToFind, "^", "\^")
StringToFind = ReplaceString(StringToFind, "$", "\$")
Protected re.i = CreateRegularExpression(#PB_Any, StringToFind + "\s|" + StringToFind + "$", #PB_RegularExpression_MultiLine | #PB_RegularExpression_AnyNewLine | flag)
If ExamineRegularExpression(re, String)
While NextRegularExpressionMatch(re)
pos = RegularExpressionMatchPosition(re)
If pos >= StartPosition
Break
EndIf
pos = 0
Wend
EndIf
FreeRegularExpression(re)
ProcedureReturn pos
EndProcedure
Debug FindStringEx("asdd K11 mit K.1 Versatz K1", "K.1", 1, #PB_String_CaseSensitive)
Re: FindString
Verfasst: 04.07.2018 20:19
von Josh
Kommt natürlich drauf an, was für Kombinationen vorkommen können. Vielleicht genügt es schon, den zu durchsuchenden String um ein Leerzeichen zu ergänzen.
Re: FindString
Verfasst: 04.07.2018 20:43
von ts-soft
Velindos hat geschrieben:"K1 " einsetze wäre das behoben, aber dann liest er auch nicht "K1"!
Josh hat geschrieben:Kommt natürlich drauf an, was für Kombinationen vorkommen können. Vielleicht genügt es schon, den zu durchsuchenden String um ein Leerzeichen zu ergänzen.
Genügt nicht

Re: FindString
Verfasst: 04.07.2018 20:49
von NicTheQuick
Alternativ kann man natürlich nach "K1 " suchen und wenn es nicht gefunden wurde nochmal prüfen, ob am Ende des Strings "K1" steht. Probleme gibt es dann aber (in meiner Version auch), wenn nach "K1" ein Komma oder ein Punkt folgt oder sonstige Zeichen, die weder Zahl noch Buchstabe sind.
Re: FindString
Verfasst: 04.07.2018 20:50
von STARGÅTE
@Nic:
Nein, du musst folgende Zeichen escapen:
welche du übrigens auch mit einem Regex selber escapen kannst

ohen den Zeilensalat da ^^
Re: FindString
Verfasst: 04.07.2018 20:56
von NicTheQuick
Dann vielleicht so:
Code: Alles auswählen
Procedure FindStringEx(String.s, StringToFind.s, StartPosition.i = 1, Mode.i = #PB_String_CaseSensitive)
Protected flag.i = 0, pos.i
If Mode <> #PB_String_CaseSensitive
flag = #PB_RegularExpression_NoCase
EndIf
Protected StringToFindEscaped.s
Protected *c.Character = @StringToFind
While *c\c
Select *c\c
Case '\', '^', '$', '{', '}', '[', ']', '(', ')', '.', '*', '+', '?', '|', '<', '>', '-', '&'
StringToFindEscaped + "\" + Chr(*c\c)
Default
StringToFindEscaped + Chr(*c\c)
EndSelect
*c + SizeOf(Character)
Wend
Protected re.i = CreateRegularExpression(#PB_Any, StringToFindEscaped + "[^a-zA-Z0-9_-äöüÄÖÜß]|" + StringToFindEscaped + "$", #PB_RegularExpression_MultiLine | #PB_RegularExpression_AnyNewLine | flag)
If ExamineRegularExpression(re, String)
While NextRegularExpressionMatch(re)
pos = RegularExpressionMatchPosition(re)
If pos >= StartPosition
Break
EndIf
pos = 0
Wend
EndIf
FreeRegularExpression(re)
ProcedureReturn pos
EndProcedure
Debug FindStringEx("asdd K11 mit K.1, Versatz K1", "K.1", 1, #PB_String_CaseSensitive)
Das ist natürlich nicht mehr so schnell wie FindString(), aber vielleicht reicht es dir ja.

Re: FindString
Verfasst: 04.07.2018 21:18
von Josh
ts-soft hat geschrieben:Genügt nicht

Und warum nicht? Nach den Angaben von Velindos ist das nicht ausgeschlossen.
Re: FindString
Verfasst: 04.07.2018 21:28
von ts-soft
Steht in meinem Erstem Zitat! Velendinos hat das also ausgeschlossen.
Re: FindString
Verfasst: 04.07.2018 21:59
von Josh
ts-soft hat geschrieben:Steht in meinem Erstem Zitat! Velendinos hat das also ausgeschlossen.
Bitte meinen ersten Beitrag lesen. Ich sprach vom
zu durchsuchenden String. Wenn Velindos wie von ihm vorgeschlagen in seinem Suchstring ein Leerzeichen anhängt und zusätzlich am zu durchsuchenden String, dann wird ein "K1" am Stringende auch gefunden.