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 :wink:

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:

Code: Alles auswählen

\ ^ $ { } [ ] ( ) . * + ? | < > - &
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. :wink:

Re: FindString

Verfasst: 04.07.2018 21:18
von Josh
ts-soft hat geschrieben:Genügt nicht :wink:
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.