FindString

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: FindString

Beitrag 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 "-------"
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: FindString

Beitrag 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)
Bild
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: FindString

Beitrag 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!
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: FindString

Beitrag von NicTheQuick »

Welche?
Bild
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: FindString

Beitrag 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!
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8675
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 32 GB DDR4-3200
Ubuntu 22.04.3 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken
Kontaktdaten:

Re: FindString

Beitrag 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.
Bild
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: FindString

Beitrag 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!
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
#NULL
Beiträge: 2235
Registriert: 20.04.2006 09:50

Re: FindString

Beitrag 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' "
my pb stuff..
Bild..jedenfalls war das mal so.
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: FindString

Beitrag von Velindos »

Hallo,
Funzt nicht!
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Mijikai
Beiträge: 754
Registriert: 25.09.2016 01:42

Re: FindString

Beitrag 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!
Antworten