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!