Seite 2 von 3
Re: FindString
Verfasst: 04.07.2018 23:45
von #NULL
Ich habe erst K1[^0-9] versucht, aber da geht er bis ins Leerzeichen wenn danach eins kommt. Aber word boundary \b scheint zu gehen, also K1\b:
Code: Alles auswählen
Procedure f(str.s, str2.s)
Protected regex = CreateRegularExpression(#PB_Any, str2+"\b")
If regex
If ExamineRegularExpression(regex, str)
While NextRegularExpressionMatch(regex)
Debug "Match: " + RegularExpressionMatchString(regex)
Debug "- Position: " + Str(RegularExpressionMatchPosition(regex))
Debug "- Length: " + Str(RegularExpressionMatchLength(regex))
Wend
EndIf
Else
Debug RegularExpressionError()
EndIf
EndProcedure
Debug "-------"
f("K11 bla", "K1") ; (nix)
Debug "-------"
f("K1 bla", "K1")
Debug "-------"
f("K1", "K1")
Debug "-------"
f("x K1 x K11 x K1 x k11", "K1")
Debug "-------"
Re: FindString
Verfasst: 04.07.2018 23:51
von NicTheQuick
Ah, genau, "\b" ist die Lösung. Danke!
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, "\b" + StringToFindEscaped + "\b", #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", "k1", 1, #PB_String_NoCase)
Re: FindString
Verfasst: 05.07.2018 15:24
von Velindos
Hallo Leute,
die Lösung habe ich integriert und trifft genau den Punkt! Sie Funzt!
Besten DANK für eure Hilfe!
Gruss ... Velindos!
Re: FindString
Verfasst: 05.07.2018 15:47
von NicTheQuick
Welche?
Re: FindString
Verfasst: 11.07.2018 15:06
von Velindos
Hallo Leute,
letzteren Vorschlag habe ich genommen!
Nun habe ich die Sache in eine SQLite Base gespielt und habe den selben Effekt!
Wenn ich "F1" suche, bringt er auch "1F1" etc.!
Möchte aber nur Elemente mit "F1".
Code: Alles auswählen
If OpenDatabase(Search_db, Database_File$, "", "", #PB_Database_SQLite)
SQL+ "SELECT DISTINCT * FROM Velindos WHERE "
SQL+ "Status LIKE '%" +MySuchwort+ "%' Or "
SQL+ "Versand LIKE '%" +MySuchwort+ "%' Or "
SQL+ "Preis LIKE '%" +MySuchwort+ "%' "
; ---------------------
If DatabaseQuery(Search_db, SQL )
; ---------------------
While NextDatabaseRow(Search_db)
; ---------------------
Search_ID$ = GetDatabaseString(Search_db,0)
; ---------------------
Wend
; ---------------------
EndIf
; ---------------------
FinishDatabaseQuery(Search_db)
CloseDatabase(Search_db)
; ---------------------
Else
MessageRequester("Database", "Fehlende Database")
EndIf
Jemand einen Tip?
Gruss ... Velindos!
Re: FindString
Verfasst: 11.07.2018 15:31
von NicTheQuick
Wenn das SQLite3 ist, dann gibt es da den
REGEXP-Operator.
Wenn ich das richtige verstehe, musst du dann sowas in der WHERE-Clause schreiben: STATUS REGEXP '\bF1\b'
Aber da ich noch nie mit SQLite gearbeitet habe, musst du das selbst ausprobieren.
Re: FindString
Verfasst: 11.07.2018 15:49
von Velindos
Hallo,
Danke für deinen Tip, muss aber sagen so Tief bin auch wieder nicht in SQLite.
Vielleicht hat noch jemand einen Tip oder ein Beispiel!
Gruss ... Velindos!
Re: FindString
Verfasst: 11.07.2018 16:38
von #NULL
Wenn du das Suchwort nicht zwischen %-dings packst dann wird er denke ich nur exakte Treffer zurückgeben, also wenn das gesamte Feld genau dem Suchwort entspricht. Du kannst aber die zurückgegebenen Rows ja auch noch auf PB-Ebene nachfiltern mit der Methode von oben.
Ansonsten probier doch einfach mal
Code: Alles auswählen
SQL+ "SELECT DISTINCT * FROM Velindos WHERE "
SQL+ "Status REGEX '\b" +MySuchwort+ "\b' Or "
SQL+ "Versand REGEX '\b" +MySuchwort+ "\b' Or "
SQL+ "Preis REGEX '\b" +MySuchwort+ "\b' "
Re: FindString
Verfasst: 12.07.2018 06:51
von Velindos
Hallo,
Funzt nicht!
Re: FindString
Verfasst: 12.07.2018 09:07
von Mijikai
Hab auch mal was gebastelt
Code: Alles auswählen
Procedure.i FindStringEx(*String,*Signature,CheckLastChar.b = #False,Offset.i = #Null)
Protected StrLen.i
Protected SigLen.i
Protected *Buffer
Protected BufferSize.i
Protected Fix.i
If *String And *Signature
StrLen = MemoryStringLength(*String)
SigLen = MemoryStringLength(*Signature)
If SigLen And StrLen
StrLen * 2
SigLen * 2
Fix = Offset
Offset * 2
If SigLen < StrLen - 1 - Offset
BufferSize = StrLen - SigLen - Offset
*Buffer = *String + Offset
For Offset = 0 To BufferSize - 1
If CompareMemory(*Buffer + Offset,*Signature,SigLen)
If CheckLastChar
If Not CompareMemory(*Buffer + Offset + SigLen,*Signature + SigLen - 2,2)
ProcedureReturn Offset / 2 + 1 + Fix
EndIf
Else
ProcedureReturn Offset / 2 + 1 + Fix
EndIf
EndIf
Next
EndIf
EndIf
EndIf
EndProcedure
Global TestString.s
Global Signature.s
TestString = "K11 mit Versatz K1 K23 usw K11 K1 Hallo!"
Signature = "K1"
Debug FindStringEx(@TestString,@Signature,#True)
Debug FindStringEx(@TestString,@Signature,#True,20)
Unterstützt momentan nur Unicode!