titan nyquist wrote:
>> Ok, do I have this right...
>> ^ anchors to front
>> $ anchors to back
>> a-z = any char from a..z
>> A-Z = any char from A..Z
>> * = 0 or more of the preceeding
>> what does ' or -' do?
> Oops...
> ^ = negates / negative
character) it negates the set.
"titan nyquist" wrote:
> How do you test a string to see if it contains special characters?
> Iwant to ensure that any names typed into my form has only letters
> (and maybe allow a dash and an apostrophe).
> I can loop RealName.Contains("..."), but there must be a more
> elegant solution.
Another possible approach:
Create a Custom User Control TextBox and override OnKeyPress to
handle ASCII characters.
protected override void OnKeyPress(System.Windows.Forms.KeyPressEventArgs e)
{
// KeyChar property of the event Gets or Sets the
// character corresponding to the key pressed
// and returns the ASCII character that is composed.
// Handled property of the event Gets or Sets a value
// indicating whether the System.Windows.Forms.Control
// .KeyPress event was handled
// and returns true if the event is handled; otherwise,
// false
int i = (int)e.KeyChar; //cast KeyChar property to integer
// Capital letters, small case letters, dash (or minus),
// and apostrophe keys are not handled (handled returns
// false) so are passed to the textBox and displayed.
// All other KeyPresses are handled (handled returns true)
// so are not passed to the textBox and are not displayed.
if (i >= 65 && i <= 90 || i >= 96 && i <= 122 || i == 39)
{
e.Handled = false;
return;
}
e.Handled = true;
}
-Tim Sprout
-----------------------------------------------Reply-----------------------------------------------
On Wed, 30 May 2007 20:54:54 -0700, Tim Sprout <t
@ptialaska.net> wrote:
> if (i >= 65 && i <= 90 || i >= 96 && i <= 122 || i == 39)
> {
> e.Handled = false;
> return;
> }
If one is going to do it that way, IMHO it is better to not convert to
integers. Even if you just did "if (e.KeyChar >= 'A' && e.KeyChar <= 'Z'
|| e.KeyChar >= 'a' && e.KeyChar <= 'z' || e.KeyChar == '\'' || e.KeyChar
== '-')", that would be more readable and more maintainable. Even better
is that you can do "if (Char.IsLetter(e.KeyChar) || e.KeyChar == '\'' ||
e.KeyChar == '-')", which is even more readable and maintainable.
(ignoring for the moment that your code leaves out one of the possible
characters...the fact that I have to go to an ASCII table to figure out
whether you forgot the apostrophe or the hyphen is an example of the lack
of readability of your code :) ).
Pete
-----------------------------------------------Reply-----------------------------------------------
"Peter Duniho" <NpOeStPe
@nnowslpianmk.com> wrote in message
news:op.ts6asj0g8jd0ej@petes-computer.local...
On Wed, 30 May 2007 20:54:54 -0700, Tim Sprout <t
@ptialaska.net> wrote:
> if (i >= 65 && i <= 90 || i >= 96 && i <= 122 || i == 39)
> {
> e.Handled = false;
> return;
> }
If one is going to do it that way, IMHO it is better to not convert to
integers. Even if you just did "if (e.KeyChar >= 'A' && e.KeyChar <= 'Z'
|| e.KeyChar >= 'a' && e.KeyChar <= 'z' || e.KeyChar == '\'' || e.KeyChar
== '-')", that would be more readable and more maintainable. Even better
is that you can do "if (Char.IsLetter(e.KeyChar) || e.KeyChar == '\'' ||
e.KeyChar == '-')", which is even more readable and maintainable.
(ignoring for the moment that your code leaves out one of the possible
characters...the fact that I have to go to an ASCII table to figure out
whether you forgot the apostrophe or the hyphen is an example of the lack
of readability of your code :) ).
Pete
Thanks for the comments, Pete!
-Tim Sprout
-----------------------------------------------Reply-----------------------------------------------
> How do you test a string to see if it contains special characters? I
> want to ensure that any names typed into my form has only letters (and
> maybe allow a dash and an apostrophe).
Be carefull what you check for. "letters" is language dependent.
If you test with (i >= 65 && i <= 90 || i >= 96 && i <= 122 || i == 39)
or regex ranges [a-zA-Z] or other such English-centric ideas, you will
affect other languages using characters outside these ranges.
And that is almost every language out there, with very few exceptions :-)
--
Mihai Nita [Microsoft MVP, Windows - SDK]
http://www.mihai-nita.net
------------------------------------------
Replace _year_ with _ to get the real email
-----------------------------------------------Reply-----------------------------------------------
"Mihai N." <nmihai_year_2
@yahoo.com> wrote in message
news:Xns99415C2FAC1EMihaiN@207.46.248.16...
> Be carefull what you check for. "letters" is language dependent.
> If you test with (i >= 65 && i <= 90 || i >= 96 && i <= 122 || i == 39)
> or regex ranges [a-zA-Z] or other such English-centric ideas, you will
> affect other languages using characters outside these ranges.
> And that is almost every language out there, with very few exceptions :-)
If you follow the Regular Expression route, you can test for characters
in Unicode groups and block ranges with the syntax \p{name}, where "name" is
a named character class. For instance, to test for all Alpha characters, you
use \p{L}. Another useful one is \p{IsBasicLatin} (warning: case
sensitive), which tests for the Unicode range that includes the English
alphabet.
-----------------------------------------------Reply-----------------------------------------------
On Thu, 31 May 2007 00:33:57 -0700, Mihai N. <nmihai_year_2
@yahoo.com>
wrote:
> Be carefull what you check for. "letters" is language dependent.
> If you test with (i >= 65 && i <= 90 || i >= 96 && i <= 122 || i == 39)
> or regex ranges [a-zA-Z] or other such English-centric ideas, you will
> affect other languages using characters outside these ranges.
Good point...one more good reason to use Char.IsLetter() instead of
explicitly checking the character code. :)
I also appreciate Alberto's information...I had no idea you could test for
specific Unicode character flags using regular expressions. Very cool.
Pete