String Manipulation

This page is going to cover a variety of the tools available for string manipulation in SIMPOL both basic and more advanced. A more comprehensive list of tools, is available here and here

For this tutorial instead of creating one overall program we are going to create a small examples for each function, it is of course possible (and recommended) to combine these, an example of this can be found here. We are using two libraries in this example, any function that has the format .function() is instrinic to SIMPOL, all others are, unless otherwise stated, part of stringlib and will require you to link the project to stringlib.sml

.len()

This funtion returns the length of a string. It can be used like so:

function main()
    string sLine
    integer iOutput

    sLine = " this is an example string, we are going to change aspects of this: "
    iOutput = .len(sLine)
end function iOutput

This should return 76 for this particular example string, we can confirm this length by pasting the string into a program like notepad++

.instr()

This function returns the position of the first instance of the search string, more usefully if the search string is not found zero is returned. This function allows you to do if-else logic with string contents, it is also useful in some later functions which require positions as parameters. The basic function use is like so:

function main()
  string sLine
  integer iOutput                   

  sLine = "     this is an example string, we are going to change aspects of this:     "
  iOutput = .instr(sLine,"example ")
end function iOutput

This should return for our example string: 17. As previously mentioned we can use this for logical statements, an example of this is:

function main()
  string sLine
  string sSearch
  string sOutput                   

  sLine = "     this is an example string, we are going to change aspects of this:     "
  sSearch = "example"

  if .instr(sLine,sSearch) == 0
    sOutput = "String: " + sSearch + "was not found"
  else
    sOutput = "Found: " + sSearch
  end if
end function sOutput

For our example it should return Found: example but if we were to search for a string that is not present, such as “SIMPOL” we would have the other output. N.B. the search strings are all case sensitive, if case sensitivity is not desired it is possible to convert a string to all upper case (.ucase) or lower case (.lcase).

.tostr()

This function turns a number into a string in any base from 2 to 36

function main()
  number nExample
  string sOutput
  
  nExample = 31415                  
  sOutput = .tostr(nExample,10)

end function sOutput

The output for this example should be the same number you put into it, as the conversion is not apparent in the console output. To prove the type conversion as an output you can use the function sOutput.type this should then output string

.rstr() and .lstr()

This pair of functions extracts characters from the left and right of the string. In our function we are gonna take the first and last 30 characters of our string and then output those 60 characters


function main()
  string sLine
  string sLeft
  string sRight
  string sOutput
  
  sLine = "     this is an example string, we are going to change aspects of this:     "
  sLeft = .lstr(sLine,30)
  sRight = .rstr(sLine,30)

  sOutput = sLeft + sRight
end function sOutput

This should output the following with our example string:" this is an example stringo change aspects of this: "

ltrim() and rtrim()

This is another pair of functions, this time they remove all spaces from the left and right of the string.

function main()
  string sLine
  string sOutput
  integer iBefore
  integer iAfter
  
  sLine = "     this is an example string, we are going to change aspects of this:     "
  iBefore = .len(sLine)
  sLine = ltrim(sLine)
  sLine = rtrim(sLine)
  iAfter = .len(sLine)
  sOutput = "Length before trim: " + .tostr(iBefore,10) + ". Length after trim: " + .tostr(iAfter,10)
end function sOutput

This makes use of several things we’ve already seen. We are first finding the length of our example string before we get rid of the blank spaces before and after using our ltrim and rtrim functions. Then we get the length after this happened. The last line makes use of the .tostr() function as well as the + to append various strings together to get a nicely formatted output: Length before trim: 76. Length after trim: 66

lpad, rpad and space

This group of functions is a more complex group of functions, it concerns itself with adding blank spaces to strings: lpad adds space (or any specified character) to the left of a string so as to make it a specified length. If the string however, is shorter than the specified length it will truncate it at that length, rpad does the exact same thing but on the right instead of the left. space is comparitively simple, it creates a string containing spaces. For this example we are going to expand on the last one, like so:

function main()
  string sLine
  string sLineAppend
  string sOutput
  
  sLine = "     this is an example string, we are going to change aspects of this:     "
  sLineAppend = "like adding things to the end of the string"
  sLine = ltrim(sLine)
  sLine = rtrim(sLine)
  sLine = lpad(sLine,.len(sLine) + 5,"-")
  sLineAppend = rpad(sLineAppend,.len(sLineAppend) + 5,"-")
  sOutput = sLine + space(5) + sLineAppend
end function sOutput

The code above trims our original string, as before. We then want to add five “-” to the beginning of the string, to do this we are going to make use of lpad. The length is going to have to be equal to the string length + 5, this is done using the following code:.len(sLine) + 5 as well as specify the replacement character as our symbol. We then want to do the exact same but to our second string. Finally we are going to append our two strings together but add spaces inbetween the two, this we’re going to do using the space function. The output for this should be as follows -----this is an example string, we are going to change aspects of this: like adding things to the end of the string-----

afterstr() & beforestr()

This pair of functions expands on .rstr(), .lstr() and .instr to trim before or after a search string. In our example we are going to trim before the comma, and after the word ‘change’.

function main()
  string sLine
  string sBefore
  string sAfter
  string sOutput
  
  sLine = " this is an example string, we are going to change aspects of this: "
  sBefore = beforestr(sLine,",")
  sAfter = afterstr(sLine,"change")
  sOutput = "Before ',': " + sBefore + ". After 'change': " + sAfter
end function sOutput

This function can be incredibly powerful when used correctly.

.substr()

This function extracts characters from a specified starting position

function main()
  string sLine
  string sSubstr
  string sOutput
  integer iPos
  integer iLen

  iPos = 20
  iLen = 10
  sLine = "     this is an example string, we are going to change aspects of this:     "
  sSubstr = .substr(sLine,iPos,iLen)
  sOutput = "Substring starting at position " + .tostr(iPos,10) + " with length of " + .tostr(iLen,10) + "is: " + sSubstr
end function sOutput

.like1()

This function attempts to find a pattern in a string. The matching occurs on a character by character basis and it is only considered a match if every character in the string matches the pattern and there are no excess characters. For more information on special matching patterns read this

function main()
  string sLine
  string sOutput
  sLine = "example@gmail.com"
  if .like1(sLine,"*?@?*.???") == .true
      sOutput = "Valid email address with a three letter domain name: " + .rstr(sLine,3)
  end if
end function sOutput

Our example here is a very basic email checker. The pattern looks for any number of characters (but there must be at least one) before the @ and again after it. After the full stop (period) it will attempt to find an address which has a three letter domain name. This is not the most comprehensive testing tool but it is a nice proof of concept for this tutorial

parsenext()

This function is an evolution of .substr it extracts a substr from given beginning and end characters.

function main()
  string sLine
  string sOutput

  sLine = "     this is an example string, we are going to change aspects of this:     "
  sOutput = parsenext(sLine,",",":")
end function sOutput

This function outputs exactly what is expected of it: we are going to change aspects of this it has cut off everything before the comma and everything after the colon


Intrinsic String Functions (Old)

stringlib (Old)