Assuming you have no fractional numbers in your text, you can do that to take punctuation into account :
// Normalize punctuation //
// Make sure there is no space following punctuation
TextArea1.Text = ReplaceAll(TextArea1.Text, ", ", ",")
TextArea1.Text = ReplaceAll(TextArea1.Text, "; ", ";")
TextArea1.Text = ReplaceAll(TextArea1.Text, ". ", ".")
TextArea1.Text = ReplaceAll(TextArea1.Text, ": ", ":")
TextArea1.Text = ReplaceAll(TextArea1.Text, "! ", "!")
TextArea1.Text = ReplaceAll(TextArea1.Text, "? ", "?")
TextArea1.Text = ReplaceAll(TextArea1.Text, ") ", ")")
TextArea1.Text = ReplaceAll(TextArea1.Text, "> ", ">")
TextArea1.Text = ReplaceAll(TextArea1.Text, "] ", "]")
TextArea1.Text = ReplaceAll(TextArea1.Text, " ", "") // Curly quote right
// Make sure every punctuation is followed by a space
TextArea1.Text = ReplaceAll(TextArea1.Text, ",", ", ")
TextArea1.Text = ReplaceAll(TextArea1.Text, ";", "; ")
TextArea1.Text = ReplaceAll(TextArea1.Text, ".", ". ")
TextArea1.Text = ReplaceAll(TextArea1.Text, ":", ": ")
TextArea1.Text = ReplaceAll(TextArea1.Text, "!", "! ")
TextArea1.Text = ReplaceAll(TextArea1.Text, "?", "? ")
TextArea1.Text = ReplaceAll(TextArea1.Text, ")", ") ")
TextArea1.Text = ReplaceAll(TextArea1.Text, ">", "> ")
TextArea1.Text = ReplaceAll(TextArea1.Text, "]", "] ")
TextArea1.Text = ReplaceAll(TextArea1.Text, "", " ") // Curly quote right
theWords = TextArea1.text.Split(" ") // text area field burst into an array of words.
If the text contains such figures as “1,234.56” then 1 234 and 56 will be treated as separate words. In order to avoid that you can check for all combinations such as 1,1 1,2 1,3 and do replacements of comma and dot by special characters (for instance ?and ?) in a couple loops before the split and the reverse operation before reassembling line.
Straight quotes are difficult to deal with as they can be both at beginning and end of words. They would require replacing all space-" by some special character such as space ? then proceed as other punctuation and reinstate them after the split.
If the end goal is to draw text onto a Canvas, it is much easier to leave that to the wrap parameter in drawString, as advised by Will Shank.