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 Dart

How to Validate Email Addresses with Regex in Dart

Validating email addresses is a crucial step in many applications, such as user registration, contact forms, and email marketing. Using regular expressions (regex) is a popular approach to validate email addresses. In this article, we will explore how to validate email addresses with regex in Dart.

Quick Example

Here is a minimal example that solves the most common use case:

import 'package:regexp/regexp.dart';

bool isValidEmail(String email) {
  final regex = RegExp(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$');
  return regex.hasMatch(email);
}

void main() {
  print(isValidEmail('example@example.com')); // true
  print(isValidEmail('invalid_email')); // false
}

This code defines a function isValidEmail that takes a string 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:

  1. import 'package:regexp/regexp.dart';: We import the regexp package, which provides the RegExp class for working with regular expressions.
  2. bool isValidEmail(String email) { ... }: We define a function isValidEmail that takes a string as input and returns a boolean.
  3. final regex = RegExp(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$');: We define a regular expression pattern using the RegExp constructor. The pattern matches most common email address formats.
    • ^ 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.
  4. return regex.hasMatch(email);: We use the hasMatch method to check if the input string matches the regex pattern.

Handling Edge Cases

Here are some common edge cases with code examples:

Empty/Null Input

print(isValidEmail('')); // false
print(isValidEmail(null)); // false

In this case, the function returns false because an empty or null string is not a valid email address.

Invalid Input

print(isValidEmail('invalid_email')); // false

In this case, the function returns false because the input string does not match the regex pattern.

Large Input

print(isValidEmail('verylongemailaddress@example.com')); // true

In this case, the function returns true because the input string matches the regex pattern, even though it is quite long.

Unicode/Special Characters

print(isValidEmail('example@éxample.com')); // false

In this case, the function returns false because the input string contains a Unicode character (é) that is not matched by the regex pattern.

Common Mistakes

Here are three common mistakes developers make when validating email addresses with regex:

Mistake 1: Using a too-permissive pattern

// Wrong code
final regex = RegExp(r'^.*@.*$');

This pattern matches almost any string, including invalid email addresses.

Mistake 2: Not escaping special characters

// Wrong code
final regex = RegExp(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$');

This pattern does not escape the . character, which has a special meaning in regex.

Mistake 3: Not handling null input

// Wrong code
bool isValidEmail(String email) {
  final regex = RegExp(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$');
  return regex.hasMatch(email);
}

This function will throw a NoSuchMethodError if the input is null.

Performance Tips

Here are two practical performance tips for this specific operation in Dart:

  1. Use a pre-compiled regex pattern: Instead of compiling the regex pattern every time the function is called, compile it once and store it in a variable.
final regex = RegExp(r'^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$');
bool isValidEmail(String email) {
  return regex.hasMatch(email);
}
  1. Use a faster regex engine: The regexp package uses a slower regex engine by default. You can use the regexp_fast package instead, which provides a faster engine.
import 'package:regexp_fast/regexp_fast.dart';

FAQ

Q: What is the best way to validate email addresses?

A: The best way to validate email addresses is to use a combination of regex and additional checks, such as checking the domain's DNS records.

Q: Can I use this regex pattern for all email addresses?

A: No, this regex pattern does not match all possible email address formats. It is recommended to use a more comprehensive pattern or a dedicated email validation library.

Q: How do I install the regexp package?

A: You can install the regexp package by adding it to your pubspec.yaml file: dependencies: regexp: ^1.0.0.

Q: Can I use this code in a Flutter app?

A: Yes, this code can be used in a Flutter app. Simply add the regexp package to your pubspec.yaml file and import it in your Dart code.

Q: Is this code secure?

A: This code is secure as long as you use a secure regex pattern and handle null input correctly. However, email address validation is not foolproof, and additional checks should be performed to ensure security.

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