Regex : how to get words from a string (C#)

c#, regex, replace, string

Solution

Simple Regex:

`\w+`

This matches a string of "word" characters. That is almost what you want.

This is slightly more accurate:

`\w(?<!\d)[\w'-]*`

It matches any number of word characters, ensuring that the first character was not a digit.

Here are my matches:

1 LOLOLOL 2 YOU'VE 3 BEEN 4 PWN3D 5 einszwei 6 drei

Now, that's more like it.

EDIT: The reason for the negative look-behind, is that some regex flavors support Unicode characters. Using [a-zA-Z] would miss quite a few "word" characters that are desirable. Allowing `\w` and disallowing `\d` includes all Unicode characters that would conceivably start a word in any block of text.

EDIT 2: I have found a more concise way to get the effect of the negative lookbehind: Double negative character class with a single negative exclusion.

`[^\W\d][\w'-]*(?<=\w)`

This is the same as the above with the exception that it also ensures that the word ends with a word character. And, finally, there is:

`[^\W\d](\w|[-']{1,2}(?=\w))*`

Ensuring that there are no more than two non-word-characters in a row. Aka, It matches "word-up" but not "word--up", which makes sense. If you want it to match "word--up", but not "word---up", you can change the `2` to a `3`.

Problem

My input consists of user-posted strings. What I want to do is create a dictionary with words, and how often they’ve been used. This means I want to parse a string, remove all garbage, and get a list of words as output. For example, say the input is `"#@!@LOLOLOL YOU'VE BEEN \***PWN3D*** ! :') !!!1einszwei drei !"` The output I need is the list: - `"LOLOLOL"` - `"YOU'VE"` - `"BEEN"` - `"PWN3D"` - `"einszwei"` - `"drei"` I’m no hero at regular expressions and have been Googling, but my Google-kungfu seams to be weak … How would I go from input to the wanted output?

Original source