Wyrażenie regularne (Regular Expression, w skrócie Regex/RegExp) to język wzorców tekstowych, który za pomocą jednego ciągu znaków opisuje i dopasowuje serię ciągów znaków spełniających określone reguły składniowe. Jego historia sięga matematycznego modelu neuronów zaproponowanego w latach 50. przez neurologa Warrena McCullocha i matematyka Waltera Pittsa, później matematyk Stephen Kleene w 1956 roku na tej podstawie zaproponował algebraiczny opis «zbiorów regularnych». Ken Thompson, ojciec Uniksa, pod koniec lat 60. po raz pierwszy zaimplementował wyrażenia regularne w edytorze QED, po czym wyrażenia regularne stały się podstawową funkcją łańcucha narzędzi Uniksa (grep, sed, awk, vi).
W nowoczesnych językach programowania wyrażenia regularne są praktycznie standardową możliwością — RegExp w JavaScript, moduł re w Pythonie, java.util.regex w Javie, klasa Regex w .NET, pakiet regexp w Go — wszystkie zapewniają obsługę regex. Wyrażenia regularne są szeroko stosowane w scenariuszach takich jak walidacja formularzy (e-mail/numer telefonu/dowód tożsamości), wyszukiwanie i zamiana tekstu (wyszukiwanie i zamiana w edytorach), analiza logów (wyodrębnianie logów ERROR), crawlery sieciowe (wyodrębnianie treści HTML), czyszczenie danych (ETL), dopasowywanie tras, filtrowanie danych wejściowych i ochrona bezpieczeństwa (reguły WAF).
Podstawowe pojęcia wyrażeń regularnych obejmują: klasy znaków (\d cyfry, \w znaki słowne, \s białe znaki), kwantyfikatory (* zero lub więcej, + jeden lub więcej, ? zero lub jeden, {n,m} określona liczba razy), kotwice (^ początek, $ koniec, \b granica słowa), grupy (... grupa przechwytująca, (?:...) grupa nieprzechwytująca, (?<name>...) nazwana grupa), alternatywa (|), zbiory znaków ([a-z]), lookaround ((?=...) pozytywne spojrzenie w przód, (?!) negatywne spojrzenie w przód) itp. Opanowanie regex znacznie zwiększa wydajność przetwarzania tekstu, ale należy również pamiętać o ochronie przed pułapkami wydajnościowymi takimi jak ReDoS.