Regular Expression Validator

B

Bryce Budd

Hi all,

I am trying to use a regular expression validator to check
for the existence of PO Box in an address textbox. The
business rule is "No addresses with PO Boxes are allowed."

What I want to happen is the Regular Expression Validator
to return false only when the string contains PO Box.
Currently it is false even when a valid address exists.

I need this validation to occur on the client, hence the
Regular Expression Validator control.

Here's the RE: I'm using in the ValidationExpression
property:

[^(P\.?\s?O\.?\sBox)+]

This currently matches (returns false/invalid) for:
smith road and smith po box road?

Any insight into the proper regular expression to achieve
my goal would be greatly appreciated.


Thanks in advance,

Bryce
 
B

Brian Davis

Try this one out:

(?i)^((?<!P\.?\s?O\.?\sBox).)+(?<!P\.?\s?O\.?\sBox)$

The (?i) turns on the ignore case option and then the expression matches the
beginning of the string, followed by 1 or more characters that are not
preceded by P.O. Box, followed by the end of the string. The repeated
negative look-behind is there to make sure that a string containing only
"P.O. Box" is not matched.


Brian Davis
www.knowdotnet.com
 
D

Dino Chiesa [Microsoft]

Do this:

go get a regex design/test tool, like
http://www.organicbit.com/regex/fog0000000019.html

Design and test the regex interactively using that tool.

When you think you have it, build a regex test app that tests all the
various combinations you can think of, and run it.
eg

namespace Ionic.Test.EmailValidation {

/// <remarks>
/// Represents all the input for the test, including the regex to test,
/// and an array of test cases.
/// </remarks>
[System.Xml.Serialization.XmlRootAttribute("Email.Validation.Input",
Namespace="", IsNullable=false)]
public class TestInput {

/// <remarks/>

[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSche
maForm.Unqualified)]
public string Regexp;

/// <remarks/>

[System.Xml.Serialization.XmlArrayAttribute(Form=System.Xml.Schema.XmlSchema
Form.Unqualified)]
[System.Xml.Serialization.XmlArrayItemAttribute("Case",
Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=false)]
public TestCase[] TestList;
}


/// <remarks>
/// This is the type that stores a single test case.
/// We need a bunch of these to verify that the regex works as
/// expected. Each test case has an input and an output. In our
/// case, the input is a string, and the output is a bool value,
/// which indicates whether the Regex should match or not.
/// Other tests will have different input and output.
/// </remarks>
public class TestCase {

/// <remarks/>
[System.Xml.Serialization.XmlAttribute("Email",
Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public string Input;

/// <remarks/>
[System.Xml.Serialization.XmlAttribute("Valid",
Form=System.Xml.Schema.XmlSchemaForm.Unqualified)]
public bool ExpectedOutput;
}


/// <remarks>
/// This is the test app. The main routine de-serializes from
/// an XML file, then runs the tests, comparing the expected
/// (or desired) output with the actual result.
/// </remarks>
public class Tester {

public static void Main() {
string InputPath= "EmailValidationInput.xml";

System.IO.FileStream fs = new System.IO.FileStream(InputPath,
System.IO.FileMode.Open);
System.Xml.Serialization.XmlSerializer s= new
System.Xml.Serialization.XmlSerializer(typeof(TestInput));
TestInput Input= (TestInput) s.Deserialize(fs);
fs.Close();

System.Text.RegularExpressions.Regex regex= new
System.Text.RegularExpressions.Regex (Input.Regexp);

foreach (TestCase tc in Input.TestList) {
System.Console.WriteLine(tc.Input +"\n " + tc.ExpectedOutput + " \\ " +
regex.IsMatch(tc.Input));
}
}
}
}



// This is input data. Store this in the XML file that is de-serialized for
this test.

<Email.Validation.Input>
<TestList>
<!--
================================================================== -->
<!-- =================== True test cases
============================== -->
<!--
================================================================== -->
<Case Email="(e-mail address removed)" Valid="true" />
<Case
Email="(e-mail address removed)"
Valid="true" />
<Case Email="[email protected]" Valid="true" />
<Case Email="(e-mail address removed)" Valid="true" />
<Case Email="(e-mail address removed)" Valid="true" />
<Case Email="(e-mail address removed)" Valid="true" />
<Case Email="(e-mail address removed)" Valid="true" />
<Case Email="(e-mail address removed)" Valid="true" />
<Case Email="(e-mail address removed)" Valid="true" />
<Case Email="(e-mail address removed)" Valid="true" />
<Case Email="(e-mail address removed)9" Valid="true" />
<Case Email="(e-mail address removed)" Valid="true" />
<Case Email="(e-mail address removed)" Valid="true" />
<Case Email="(e-mail address removed)" Valid="true" />
<Case
Email="(e-mail address removed)"
Valid="true" />

<!--
================================================================== -->
<!-- =================== False="test cases
============================= -->
<!--
================================================================== -->
<Case Email="(e-mail address removed)" Valid="false"/>
<Case Email="(e-mail address removed)." Valid="false" />
<Case Email="(e-mail address removed)." Valid="false" />
<Case Email="[email protected]." Valid="false" />
<Case Email="[email protected]" Valid="false" />
<Case Email="[email protected]" Valid="false" />
<Case Email="elmo@cloud9" Valid="false" />
<Case Email="(e-mail address removed)9" Valid="false" />
<Case Email="[email protected]" Valid="false" />
<Case Email="9Lives.club.org" Valid="false" />
<Case Email="@club.org" Valid="false" />
<Case Email="(e-mail address removed)" Valid="false" />


</TestList>

<Regexp>^([A-Za-z0-9]([\.\-A-Za-z0-9_]*[A-Za-z0-9])?)@([A-Za-z0-9]([\.\-A-Za
-z0-9_]*[A-Za-z0-9])*\.[A-Za-z0-9]([\.\-A-Za-z0-9_]*[A-Za-z0-9])?)$</Regexp>

<!--
<Regexp>^(\w([\.\-\w]*\w)?)@(\w([\.\-\w]*\w)*\.\w([\.\-\w]*\w)?)$</Regexp> -
->

</Email.Validation.Input>




Brian Davis said:
Try this one out:

(?i)^((?<!P\.?\s?O\.?\sBox).)+(?<!P\.?\s?O\.?\sBox)$

The (?i) turns on the ignore case option and then the expression matches the
beginning of the string, followed by 1 or more characters that are not
preceded by P.O. Box, followed by the end of the string. The repeated
negative look-behind is there to make sure that a string containing only
"P.O. Box" is not matched.


Brian Davis
www.knowdotnet.com



Bryce Budd said:
Hi all,

I am trying to use a regular expression validator to check
for the existence of PO Box in an address textbox. The
business rule is "No addresses with PO Boxes are allowed."

What I want to happen is the Regular Expression Validator
to return false only when the string contains PO Box.
Currently it is false even when a valid address exists.

I need this validation to occur on the client, hence the
Regular Expression Validator control.

Here's the RE: I'm using in the ValidationExpression
property:

[^(P\.?\s?O\.?\sBox)+]

This currently matches (returns false/invalid) for:
smith road and smith po box road?

Any insight into the proper regular expression to achieve
my goal would be greatly appreciated.


Thanks in advance,

Bryce
 

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