how to test a string if it contains special characters

T

titan nyquist

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

Alberto Poblacion

titan nyquist said:
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
 
T

titan nyquist

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

titan nyquist

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
 
T

titan nyquist

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
 
A

Alberto Poblacion

titan nyquist said:
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.
 
?

=?ISO-8859-1?Q?G=F6ran_Andersson?=

titan said:
Oops...

^ = negates / negative

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

Tim Sprout

titan nyquist said:
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
 
P

Peter Duniho

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
 
T

Tim Sprout

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
 
M

Mihai N.

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 :)
 
A

Alberto Poblacion

Mihai N. said:
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.
 
P

Peter Duniho

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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top