Try it yourself with our free Regex Tester tool — runs entirely in your browser, no signup needed.

How to Validate email addresses with regex in C#

How to Validate Email Addresses with Regex in C#

Validating email addresses is a crucial step in many applications, such as user registration, contact forms, and newsletters. A well-crafted regular expression (regex) can help ensure that the input email addresses are correctly formatted and reduce the risk of errors or security vulnerabilities. In this article, we will explore how to validate email addresses using regex in C#.

Quick Example

Here is a minimal example that uses a regex pattern to validate an email address:

using System.Text.RegularExpressions;

public bool IsValidEmail(string email)
{
    string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";
    return Regex.IsMatch(email, pattern);
}

This code defines a method IsValidEmail that takes an email address as input and returns a boolean indicating whether the email is valid.

Step-by-Step Breakdown

Let's walk through the code line by line:

  • string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";:
    • This line defines the regex pattern used to validate email addresses.
    • The pattern consists of several parts:
      • ^ matches the start of the string.
      • [a-zA-Z0-9._%+-]+ matches one or more alphanumeric characters, dots, underscores, percent signs, plus signs, or hyphens.
      • @ matches the @ symbol.
      • [a-zA-Z0-9.-]+ matches one or more alphanumeric characters, dots, or hyphens.
      • \. matches a period (escaped with a backslash because . has a special meaning in regex).
      • [a-zA-Z]{2,} matches the domain extension (it must be at least 2 characters long).
      • $ matches the end of the string.
  • return Regex.IsMatch(email, pattern);:
    • This line uses the Regex.IsMatch method to test whether the input email address matches the regex pattern.
    • The IsMatch method returns a boolean indicating whether the input string matches the pattern.

Handling Edge Cases

Here are some common edge cases and how to handle them:

Empty/Null Input

To handle empty or null input, you can add a simple null check:

public bool IsValidEmail(string email)
{
    if (string.IsNullOrEmpty(email))
    {
        return false;
    }
    string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";
    return Regex.IsMatch(email, pattern);
}

Invalid Input

To handle invalid input, you can use a try-catch block to catch any exceptions thrown by the Regex.IsMatch method:

public bool IsValidEmail(string email)
{
    try
    {
        string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";
        return Regex.IsMatch(email, pattern);
    }
    catch (ArgumentException ex)
    {
        // Handle invalid input
        return false;
    }
}

Large Input

To handle large input, you can use the RegexOptions.Compiled option to compile the regex pattern:

public bool IsValidEmail(string email)
{
    string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";
    var regex = new Regex(pattern, RegexOptions.Compiled);
    return regex.IsMatch(email);
}

Unicode/Special Characters

To handle Unicode or special characters, you can use the RegexOptions.IgnoreCase option to ignore case:

public bool IsValidEmail(string email)
{
    string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";
    var regex = new Regex(pattern, RegexOptions.IgnoreCase);
    return regex.IsMatch(email);
}

Common Mistakes

Here are three common mistakes developers make when using regex to validate email addresses:

Mistake 1: Using an Incorrect Pattern

Wrong code:

string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+$";

Correct code:

string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";

Explanation: The incorrect pattern does not match the domain extension.

Mistake 2: Not Handling Null Input

Wrong code:

public bool IsValidEmail(string email)
{
    string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";
    return Regex.IsMatch(email, pattern);
}

Correct code:

public bool IsValidEmail(string email)
{
    if (string.IsNullOrEmpty(email))
    {
        return false;
    }
    string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";
    return Regex.IsMatch(email, pattern);
}

Explanation: The incorrect code does not handle null input.

Mistake 3: Not Compiling the Regex Pattern

Wrong code:

public bool IsValidEmail(string email)
{
    string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";
    return Regex.IsMatch(email, pattern);
}

Correct code:

public bool IsValidEmail(string email)
{
    string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";
    var regex = new Regex(pattern, RegexOptions.Compiled);
    return regex.IsMatch(email);
}

Explanation: The incorrect code does not compile the regex pattern, which can lead to performance issues.

Performance Tips

Here are three performance tips for validating email addresses with regex in C#:

  1. Compile the regex pattern: Compiling the regex pattern can improve performance by reducing the overhead of parsing the pattern.
  2. Use the RegexOptions.IgnoreCase option: Using the RegexOptions.IgnoreCase option can improve performance by reducing the number of iterations required to match the pattern.
  3. Use a cached regex instance: Caching a regex instance can improve performance by reducing the overhead of creating a new instance for each validation.

FAQ

Q: What is the most common regex pattern for validating email addresses?

A: The most common regex pattern for validating email addresses is ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$.

Q: How do I handle null input when validating email addresses?

A: You can handle null input by adding a simple null check before validating the email address.

Q: How do I handle large input when validating email addresses?

A: You can handle large input by using the RegexOptions.Compiled option to compile the regex pattern.

Q: Can I use the RegexOptions.IgnoreCase option to ignore case when validating email addresses?

A: Yes, you can use the RegexOptions.IgnoreCase option to ignore case when validating email addresses.

Q: How do I cache a regex instance to improve performance?

A: You can cache a regex instance by creating a static instance of the Regex class and reusing it for each validation.

AI agent tools available. The CodeTidy MCP Server gives Claude, Cursor, and other AI agents access to 60+ developer tools. One command: npx @codetidy/mcp