Home     |     .Net Programming    |     cSharp Home    |     Sql Server Home    |     Javascript / Client Side Development     |     Ajax Programming

Ruby on Rails Development     |     Perl Programming     |     C Programming Language     |     C++ Programming     |     IT Jobs

Python Programming Language     |     Laptop Suggestions?    |     TCL Scripting     |     Fortran Programming     |     Scheme Programming Language


 
 
Cervo Technologies
The Right Source to Outsource

MS Dynamics CRM 3.0

C# Programming

how to test a string if it contains special characters


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).

I can loop RealName.Contains("..."), but there must be a more elegant
solution.

"titan nyquist" <titan.nyqu@gmail.com> wrote in message

news:1180525805.159233.135640@q69g2000hsb.googlegroups.com...

> 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).

> I can loop RealName.Contains("..."), but there must be a more elegant
> solution.

   You can use a Regular Expression:

   RegEx re = new RegEx("^[-'a-zA-Z]*$");
   if (re.IsMatch(stringToTest)) ....//string is correct

-----------------------------------------------Reply-----------------------------------------------

Thanks!

>    You can use a Regular Expression:

>    RegEx re = new RegEx("^[-'a-zA-Z]*$");
>    if (re.IsMatch(stringToTest)) ....//string is correct

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?

-----------------------------------------------Reply-----------------------------------------------

> 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

-----------------------------------------------Reply-----------------------------------------------

> > what does ' or -' do?

I don't know where my head is... -' is just including ' and - to the
allowed character list.  Now I get it all.  Thank you!

Titan

-----------------------------------------------Reply-----------------------------------------------

"titan nyquist" <titan.nyqu@gmail.com> wrote in message

news:1180527068.428755.73200@u30g2000hsc.googlegroups.com...

>>    RegEx re = new RegEx("^[-'a-zA-Z]*$");
>>    if (re.IsMatch(stringToTest)) ....//string is correct

> 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?

    You said that you might also allow dashes and apostrophes, so that's why
I added ' and -. If you only want letters, then leave just [a-zA-Z].

> Oops...
> ^ = negates / negative

    No, when the caret is used at the beginning of the expression your first
interpretation was right: Anchor at front.

-----------------------------------------------Reply-----------------------------------------------
Thanks for clarifying!

-----------------------------------------------Reply-----------------------------------------------

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

Outside a set ^ matches the start of the string, inside a set (as first
character) it negates the set.

--
Gran Andersson
_____
http://www.guffa.com

-----------------------------------------------Reply-----------------------------------------------

"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

 
Add to del.icio.us | Digg this | Stumble it | Powered by Megasolutions Inc