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?
- Another thread having answers to consider stackoverflow.com/questions/2371780 Might provide additional insight.John K– John K2010-06-17 12:57:41 +00:00Commented Jun 17, 2010 at 12:57
- possible duplicate of .net Regular Expression to match any kind of letter from any languageGvS– GvS2010-06-17 12:59:13 +00:00Commented Jun 17, 2010 at 12:59
4 Answers
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.
3 Comments
All is a linq extension of string. See msdn.microsoft.com/en-us/library/system.string.aspxInvestigate char.IsLetterOrDigit(char).
For example:
myString.All(c => char.IsLetterOrDigit(c)); 3 Comments
IsLetterOrDigit instead of just IsLetter.myString.All(char.IsLetterOrDigit);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äöüÄÖÜß].