tags:

views:

185

answers:

4

Allowed characters are (at least) A-Z, a-z, 0-9, ö, Ö, ä, ä, å, Å and german, latvian, estonian (if any) special chars? Is there ready-made method or do i have to make blacklist (non-allowed chars) and regular expressions IsMatch? If no ready-made how to use blacklist?

Cheers & BR -Matti

A: 

Investigate char.IsLetterOrDigit(char).

For example:

myString.All(c => char.IsLetterOrDigit(c));
Flynn1179
Just curious, but why was this downvoted? As far as I can tell it's a perfectly valid way of doing what the OP asked.
Flynn1179
Ah.. just had a closer look; never noticed the 0-9 requirement in there. I've amended my answer to use `IsLetterOrDigit` instead of just `IsLetter`.
Flynn1179
+4  A: 

A blacklist for characters is likely pretty large :-)

You can use the regular expression

^[\d\p{L}]+$

to match decimal digits and letters, regardless of script.

This regular expression consists of a character class containing the shorthands \d – which contains every digit (230 in total in the BMP) and \p{L} which contains every Unicode character classified as a "letter" (46817 in the BMP). Said character class is then repeated at least once and embedded between ^ and $ – the string start and end anchors, so it matches the complete string.

For some regex engines, since you're only interested in Latin letters, apparently, you could also use

^[\d\p{Letter}]+$

However, .NET doesn't support this. The first regex mentioned above actually catches everything that's a digit or a letter in any script. So it will dutifully match on Indian or Arabic numerals and Hebrew, Cyrillic and other non-Latin scripts. Depending on what you want this may not be appropriate.

If that poses a problem, then I see no better option than to explicitly list the characters you want to allow. However, I consider it dangerous to assume that text in a certain language is always restricted to that language's script. If I were to write a Czech or Polish name in a German text, then I'd likely need more than just [a-zA-ZäöüÄÖÜß].

Joey
+1 for the \p{option}
Adrian Regan
thanks! can you please explain how ^[\d\p{L}]+$ works. I checked from the web but I couldn't sum it up entirely...
matti
A: 

It would be simpler to match allowed characters catch a false return.

Brook Julias
+4  A: 

I don't know how special characters from all those languages are categorised, but you could check if the Char.IsLetterOrDigit method matches what you want to do. It works at least for the digits and letters I tested:

string test = "Aasdf345ÅÄÖåäöéÉóÓüÜïÏôÔ";
if (test.All(Char.IsLetterOrDigit)) { ... }

The Char.IsLetterOrDigit returns true for characters that are categorised in Unicode as UppercaseLetter, LowercaseLetter, TitlecaseLetter, ModifierLetter, OtherLetter, or DecimalDigitNumber.

Guffa