keep some characters and reject others

Share your advanced PureBasic knowledge/code with the community.
applePi
Addict
Addict
Posts: 1404
Joined: Sun Jun 25, 2006 7:28 pm

keep some characters and reject others

Post by applePi »

suppose we have this very big string:
mainString.s = "aabgdhowz56uy6..."
and this small string
maskString.s = "6adoy6867"
the purpose is to keep only the characters in the mainString which found in maskString
we should get this result aado6y6
using the approach by Fred here: http://www.purebasic.fr/english/viewtop ... 55#p497636 for ascii and unicode mode
more ideas or codes thanks in advance

tested in v5.62 and v5.46 LTS

Code: Select all

Declare.s retain(mainString.s,maskString.s)

mainString.s = "aabgdhowz56uy6"
maskString.s = "6adoy6867"
Debug mainString: Debug maskString

Debug retain(mainString,maskString)

Procedure.s retain(mainString.s,maskString.s)

result.s = Space(Len(mainString)*2)

lng.l = Len(mainString) - 1
For i=0 To lng
  char.s = PeekS(@mainString+(i*SizeOf(Character)),1)
  found = FindString(maskString, char, 1)
  If found
    PokeS(@result+(res*SizeOf(Character)),char, 1)
    res+1
  EndIf
Next

ProcedureReturn result

EndProcedure
oO0XX0Oo
User
User
Posts: 78
Joined: Thu Aug 10, 2017 7:35 am

Re: keep some characters and reject others

Post by oO0XX0Oo »

Code: Select all

Declare.s retain(mainString.s, maskString.s)

Procedure.s retain(mainString.s, maskString.s)
  Protected.s result = ""
  Protected.i pattern

  pattern = CreateRegularExpression(#PB_Any, "[" + maskString + "]", #PB_RegularExpression_NoCase)
  If pattern
    If ExamineRegularExpression(pattern, mainString)
      While NextRegularExpressionMatch(pattern)
        result = result + RegularExpressionMatchString(pattern)
      Wend
    EndIf
    FreeRegularExpression(pattern)
  EndIf

ProcedureReturn result
EndProcedure

Debug retain("aabgdhowz56uy6", "6adoy6867")
or

Code: Select all

Declare.s retain(mainString.s, maskString.s)
Declare.s join(Array StringArray.s(1), separator.s="")

Procedure.s retain(mainString.s, maskString.s)
  Protected.s result = ""
  Protected.i pattern

  pattern = CreateRegularExpression(#PB_Any, "[" + maskString + "]", #PB_RegularExpression_NoCase)
  If pattern
    Dim a.s(0)
    ExtractRegularExpression(pattern, mainString, a())
    FreeRegularExpression(pattern)
  EndIf
  result = Join(a())

ProcedureReturn result
EndProcedure


; http://www.purebasic.fr/english/viewtopic.php?f=12&t=65159
Procedure.s join(Array StringArray.s(1), separator.s="")
  Protected.i aSize, i, sLen, tLen
  Protected *buffer

  aSize = ArraySize(StringArray())
  sLen = Len(separator)
  For i = 0 To aSize
    tLen + Len(StringArray(i)) + sLen
  Next
  tLen - sLen

  Protected Dim buffer.c(tLen)
  *buffer = @buffer()
  CopyMemoryString(StringArray(0), @*buffer)
  For i = 1 To aSize
    CopyMemoryString(separator)
    CopyMemoryString(StringArray(i))
  Next

  ProcedureReturn PeekS(@buffer())
EndProcedure

Debug retain("aabgdhowz56uy6", "6adoy6867")
Post Reply