Introduction to C# Regex: Why It’s a Powerful Tool for Text Manipulation
Before diving into the magical world of regular expressions, let’s get an idea of why using C# Regex is important and how it can boost your productivity as a developer.
In this section, we’ll walk through the basics of regular expressions, their syntax, and key elements to help you get started.
What is C# Regex and Why You Should Learn It
C# Regex, or regular expressions in C#, is a powerful tool that allows you to manipulate text data by searching, matching, and replacing patterns within the text.
It helps in solving a great number of text-related tasks, such as form validation, data extraction, and text transformations.
Mastering C# regular expressions will make you a more efficient developer and provide you the ability to tackle complex text-manipulation tasks with ease.
Regular Expressions in C#: A Brief Overview
Regular expressions are a language for specifying patterns in text data. It’s like a super-powered version of the wildcard functionality you’re familiar with, but much more powerful and flexible.
In C#, you don’t need to worry about including any special library, as Regex is natively supported.
The System.Text.RegularExpressions
namespace contains the Regex
class, which provides all the tools needed for working with regular expressions in C#.
The Power of .NET Regex: The Ultimate String Search Pattern Tool
The .NET Regex engine is not only efficient and widely-used, but it also supports an extensive set of features. Say goodbye to lengthy, error-prone string manipulation code.
Mastering the power of C# Regex will help you create more accurate, concise, and efficient string search patterns that will make your applications more reliable and robust.
Getting Started with Regex in C#: Essential Building Blocks
To effectively use regular expressions in C#, it’s essential to understand the syntax and building blocks.
In this section, we’ll cover the basics of C# Regex syntax, key elements for matching, capturing, and replacing text, and give you an example to get started with matching patterns.
Understanding C# Regular Expressions Syntax
Regular expressions have their own syntax, which can be intimidating at first. But fear not! With practice and a bit of patience, you’ll start seeing the beauty in this concise and expressive language.
Here’s a quick overview of some syntax elements you’ll need to know:
-
^
: Indicates the start of a line. -
$
: Indicates the end of a line. -
.
: Matches any character except a newline. -
*
: Matches the preceding element 0 or more times. -
+
: Matches the preceding element 1 or more times. -
{n}
: Matches exactly n occurrences of the preceding element. -
[abc]
: Matches any one of the characters a, b, or c. -
(abc)
: Groups the expression inside the parentheses and treats them as a single element.
And that’s just the tip of the iceberg! As you progress in your Regex journey, you’ll discover more advanced elements to create even more powerful search patterns.
Key Regular Expression C# Elements: Matching, Capturing and Replacing
Using regex in C# starts with three fundamental techniques: matching, capturing, and replacing. Matching involves finding if a pattern exists in the input text, while capturing goes beyond matching and extracts the matched text for further processing.
Replacing, as the name suggests, involves changing the matched text and substituting it with new content.
For example, let’s say you have a list of email addresses and you want to extract the usernames (the part before the @ symbol) from them. Here’s a simple C# regex example that demonstrates the three techniques in action:
using System;
using System.Text.RegularExpressions;
class MainClass
{
public static void Main(string[] args)
{
string input = "alice@example.com, bob@example.com, carol@example.com";
string pattern = @"([\w]+)@";
// Matching and Capturing
MatchCollection matches = Regex.Matches(input, pattern);
foreach (Match match in matches)
{
Console.WriteLine(match.Groups[1].Value); // Extract the captured group (username)
}
// Replacing
string replaced = Regex.Replace(input, pattern, "$1 is at ");
Console.WriteLine(replaced);
}
}
This code snippet demonstrates how to:
- Match and capture usernames using the regex
([\\w]+)@
- Extract the captured group (the username) within a loop
- Replace the email addresses with a modified version, so that email addresses are displayed as “username is at example.com”
Regex C# Match: The Importance of Accurate Matching in C
Accurate matching is the crux of regex usage in C#. An incorrect pattern can lead to bugs and issues in your application, so it is crucial to have a strong grasp of regex patterns. Regular expressions can be very complex, but with practice, you’ll be able to create precise, efficient, and intelligible patterns.
Take the time to test and refine your regex patterns, as this will prove invaluable in the long run.
Regex Match C# Example: The Essential Code to Get You Started on Matching
To give you a head start in mastering matching in C# regex, here’s a basic example demonstrating how to match a regex pattern against an input string:
using System;
using System.Text.RegularExpressions;
class MainClass
{
public static void Main(string[] args)
{
string input = "Hooray for Regex! It's a match made in code heaven!";
string pattern = @"\bmatch\b";
// Check if the word "match" is in the input string
bool isMatch = Regex.IsMatch(input, pattern);
Console.WriteLine(isMatch); // Output: True
}
}
In this example, we use the Regex.IsMatch
method to check if the word “match” is present within the input string, and then output the result (True/False) accordingly.
C# Regex Pattern: Building Complex and Efficient Patterns
As you gain experience with C# regex, you’ll become familiar with the endless potential of regex patterns. Creating complex and efficient patterns requires understanding new syntax elements, as well as the ability to nest and combine them effectively.
Keep practicing and exploring regex resources to help you build increasingly intricate and powerful patterns.
Mastering Regex in C# with Simple Regex Examples C
To help you make quick progress in your regex journey, we’ll explore three examples – basic, intermediate, and advanced – that demonstrate using C# regex in real-world situations. Each example will showcase different regex concepts and techniques to help you become a true regex aficionado.
Basic C# Regex Example: A Simple Regular Expression for Email Validation
Email validation is a common task encountered by developers. The following example demonstrates a basic regex pattern that checks if an input string is a valid email address:
using System;
using System.Text.RegularExpressions;
class MainClass
{
public static void Main(string[] args)
{
string input = "john.doe@example.com";
string pattern = @"^\S+@\S+\.\S+$";
// Check if the input is a valid email address
bool isValidEmail = Regex.IsMatch(input, pattern);
Console.WriteLine(isValidEmail); // Output: True
}
}
In this example, we use the Regex.IsMatch
method again, but with a more complex pattern that checks for a valid email format.
Intermediate C# Regex Example: Web Scraping Using Regular Expressions
This intermediate example demonstrates how to extract specific information from a block of HTML text using regex. Consider the following example that extracts all the URLs from a list of links in an HTML page:
using System;
using System.Text.RegularExpressions;
class MainClass
{
public static void Main(string[] args)
{
string input = @"<a href=""https://www.example.com"">Example 1</a>
<a href=""https://www.example2.com"">Example 2</a>
<a href=""https://www.example3.com"">Example 3</a>";
string pattern = @"href=""(https?://\S+?)""";
// Find and output each URL in the input string
MatchCollection matches = Regex.Matches(input, pattern);
foreach (Match match in matches)
{
Console.WriteLine(match.Groups[1].Value); // Output: Extracted URL
}
}
}
Here, we use the Regex.Matches
method to find and capture all URLs within the <a>
tags in the input string. The extracted URLs are then printed to the console.
Advanced C# Regex Example: A Case Study on Extracting Structured Data from Unstructured Text
In this advanced example, we’ll extract structured data from an unstructured block of text: let’s say, grabbing the name, location, and email from a resume-like text.
using System;
using System.Text.RegularExpressions;
class MainClass
{
public static void Main(string[] args)
{
string input = @"Name: Jane Smith
Location: New York, NY
Email: jane.smith@email.com";
string pattern = @"Name:\s+(?<name>.+)
Location:\s+(?<location>.+)
Email:\s+(?<email>\S+@\S+\.\S+)";
RegexOptions options = RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace;
Match match = Regex.Match(input, pattern, options);
if (match.Success)
{
Console.WriteLine($"Name: {match.Groups["name"].Value}");
Console.WriteLine($"Location: {match.Groups["location"].Value}");
Console.WriteLine($"Email: {match.Groups["email"].Value}");
}
}
}
In this example, named capture groups (using (?<name>...)
) are employed to make extracting the desired information easier. Additionally, the RegexOptions.Multiline
and RegexOptions.IgnorePatternWhitespace
options are used to allow for multiline matching and ignore whitespace in our pattern, respectively.
C# Regex Replace: Updating Text with Precision and Efficiency
Efficient text manipulation involves more than just finding and capturing text. Understanding how to use C# regex replace techniques with precision will significantly enhance your text-processing skills.
In this section, we’ll explore the art of regex replace in C# and delve into tips and tricks for optimal results.
The Art of C# Regex Replace: How to Replace Text Like a Pro
Regex replace allows us to modify the input text based on a regex pattern, substituting the matched text with new content. This is particularly useful when cleaning up or transforming data. The power and flexibility offered by regex replace will turn you into a text-manipulation maestro in no time!
Using Regex in C# to Replace Text: Tips and Tricks for Optimal Results
Here are some tips and tricks for using regex replace in C# to achieve optimal results:
- Use non-capturing groups
(?:...)
when the matched text doesn’t need to be captured. It makes the regex pattern more efficient and readable. - Utilize regex replace with a lambda expression for more complex replacements.
- Keep your regex patterns concise and readable for easier maintainability.
Regex.Replace C# Example: Implementing Advanced Replacement Rules
Let’s say you have a string that contains dates in the format ‘yyyy-MM-dd’ and you need to replace them with the format ‘dd-MM-yyyy’:
using System;
using System.Text.RegularExpressions;
class MainClass
{
public static void Main(string[] args)
{
string input = "I was born on 2001-05-15 and started my job on 2020-01-01.";
string pattern = @"(\d{4})-(\d{2})-(\d{2})";
string replacement = "$3-$2-$1";
// Replace dates with the new format
string output = Regex.Replace(input, pattern, replacement);
Console.WriteLine(output); // Output: I was born on 15-05-2001 and started my job on 01-01-2020.
}
}
In this example, we use capturing groups to create a replacement template, which reformats the date string with the desired pattern.
Essential .NET Regex Functions: Making Your C# Regex more Powerful
To truly harness the power of regex in C#, it’s essential to master the built-in .NET Regex functions. In this section, we’ll cover key functions such as Regex.IsMatch
, Regex.Matches
, Regex.Replace
, and more, giving you the skills necessary to handle even the most complex text-manipulation tasks with ease.
C# Regex IsMatch: Quickly Checking If a String Matches a Pattern
The Regex.IsMatch
method allows you to quickly check if an input string matches a regex pattern, returning a bool
value that represents the result. This function is especially useful for simple validations and pattern checks.
Here’s an example that ensures a password contains at least one uppercase letter, one lowercase letter, one digit, and is between 8 and 14 characters long:
using System;
using System.Text.RegularExpressions;
class MainClass
{
public static void Main(string[] args)
{
string input = "Abc12345";
string pattern = @"^(?=.*[A-Z])(?=.*[a-z])(?=.*\d).{8,14}$";
// Check if the input is a valid password
bool isValidPassword = Regex.IsMatch(input, pattern);
Console.WriteLine(isValidPassword); // Output: True
}
}
In this example, the Regex.IsMatch
method checks if the input string matches the password requirements specified in the pattern.
Using C# Regex.Matches: Extracting Multiple Matches from a Single Call
The Regex.Matches
method enables you to extract multiple matches from a single input string, returning a MatchCollection
object containing all matches found. This method is incredibly useful for extracting data from large, unstructured text.
Here’s an example that finds all words containing 4 or more characters in a string:
using System;
using System.Text.RegularExpressions;
class MainClass
{
public static void Main(string[] args)
{
string input = "Regex can do wonders for your text manipulation skills!";
string pattern = @"\b\w{4,}\b";
// Find and output all words containing 4 or more characters
MatchCollection matches = Regex.Matches(input, pattern);
foreach (Match match in matches)
{
Console.WriteLine(match.Value);
}
}
}
In this example, the Regex.Matches
method finds and extracts all words in the input string that match the specified pattern.
Mastering C# Regex.Replace: Up Your Game in Text Manipulation
As we’ve seen in previous examples, the Regex.Replace
method provides a powerful way to manipulate text by replacing matched portions of an input string with new content.
To truly master text manipulation in C#, you’ll need to have a deep understanding of Regex.Replace
, including how to use it with capture groups, backreferences, and Lambda expressions for added power and flexibility.
Exploring Other Regular Expression C# Methods: C# Replace Regex, Check Regex, and More
In addition to the core C# Regex methods we’ve discussed, make sure to explore other useful methods available in the Regex
class, such as Regex.Split
, Regex.Escape
, and Regex.Unescape
.
Each of these methods offers additional functionalities that can help you streamline your text processing tasks and create more advanced and efficient applications.
The C# Regex Cheat Sheet: A Handy Reference Guide for Common Regex Tasks
To help solidify your understanding of regular expressions in C#, here’s a cheat sheet containing numerous essential regex syntax elements, functions, and patterns that every C# developer should know.
C# String Pattern Essentials: Building Blocks Every Developer Should Know
-
^
: Start of a line -
$
: End of a line -
.
: Any character except newline -
*
: 0 or more of the preceding character -
{n,m}
: At least n, up to m of the preceding character -
(abc)
: Capturing group -
[abc]
: Character set (matching a, b, or c) -
[^abc]
: Negated character set (matching characters not in a, b, or c) -
|
: Alternation (match one of the expressions on either side of the|
)
These are just a few examples of the regex syntax elements you’ll encounter. The full list of regex syntax elements can be found in the official .NET documentation.
System.Text.RegularExpressions.Regex.IsMatch: Your Go-To Function for Quick Matching
As previously mentioned, the Regex.IsMatch
method is a quick and easy way to check if an input string matches a regex pattern. Add this method to your toolbox to handle simple pattern checks and validations effortlessly.
A Comprehensive List of Regex C# Match Chars and Shortcuts: From Simple to Advanced
-
\d
: A digit -
\D
: A non-digit character -
\w
: A word character (letter, digit, or underscore) -
\W
: A non-word character -
\s
: A whitespace character (space, tab, newline, etc.) -
\S
: A non-whitespace character -
(?=...)
: Positive lookahead -
(?!...)
: Negative lookahead -
(?<=...)
: Positive lookbehind -
(?<!...)
: Negative lookbehind -
(?:...)
: Non-capturing group -
\1
,\2
, etc.: Backreferences to previously captured groups
This expanded list offers a more comprehensive look at the various regex elements available to you.
Continuously expand your knowledge by exploring regex tutorials, guides, and documentation to better understand and utilize C# regex patterns in your projects.
Advanced C# Regex: Techniques to Boost Efficiency and Improve Performance
As you become more proficient in using C# regex, you’ll want to explore advanced techniques that can boost efficiency and improve performance.
In this section, we discuss how to optimize your regex patterns for faster results, implement complex regex requirements, and employ C# best practices for clean and effective code.
Optimizing Your Regex C# Match Searches for Faster Results
Efficient regex patterns yield better performance. Here are a few tips to optimize your regex searches with practical examples:
- Use non-capturing groups whenever possible.
Instead of using
(expression)
which captures the expression, use(?:expression)
which matches but won’t capture the expression.
//Capturing group example
string input = "The color is red.";
Match match = Regex.Match(input, "The color is (red|blue)");
Console.WriteLine(match.Groups[1].Value); // Output: red
//Non-capturing group example
input = "The color is red.";
match = Regex.Match(input, "The color is (?:red|blue)");
Console.WriteLine(match.Groups[0].Value); // Output: The color is red.
- Avoid overly complex or nested patterns. Simplify your regex pattern, and divide it into smaller patterns if needed. Refactor your code to use multiple simple patterns instead of a single complex pattern.
- Utilize anchors (
^
and$
) to limit the search scope. Anchors can help speed up the regex matching as they limit the search scope, reducing the processing time.
string input = "apple\nbanana\ngrape\norange";
string pattern = "^grape$";
Match match = Regex.Match(input, pattern, RegexOptions.Multiline);
Console.WriteLine(match.Value); // Output: grape
Implementing C# String Search Patterns for Complex Regex Requirements
Implementing complex regex requirements often involves using advanced regex features, such as lookahead and lookbehind assertions.
These allow you to create patterns that take the surrounding context into account without actually capturing the text. Understanding and utilizing these advanced features will enable you to create more powerful and precise search patterns.
Lookahead
Positive lookahead (?=...)
ensures that the pattern inside the lookahead is present in the string but doesn’t consume characters in the string.
string input = "I want to buy a car and a bike";
string pattern = @"\ba(?:\w+)(?= a\b)";
MatchCollection matches = Regex.Matches(input, pattern);
foreach (Match match in matches)
{
Console.WriteLine(match.Value);
}
// Output:
// car
Negative lookahead (?!...)
ensures that the pattern inside the lookahead is not present in the string but doesn’t consume characters in the string.
input = "I want to buy a car and a bike";
pattern = @"\ba(\w+)(?! a\b)";
matches = Regex.Matches(input, pattern);
foreach (Match match in matches)
{
Console.WriteLine(match.Value);
}
// Output:
// bike
Lookbehind
Positive lookbehind (?<=...)
ensures that the pattern inside the lookbehind is present in the string but doesn’t consume characters in the string.
input = "100 kg of apples and 200 kg of oranges";
pattern = @"(?<=\d{3}\s)kg";
matches = Regex.Matches(input, pattern);
foreach (Match match in matches)
{
Console.WriteLine(match.Value);
}
// Output:
// kg
Negative lookbehind (?<!...)
ensures that the pattern inside the lookbehind is not present in the string but doesn’t consume characters in the string.
string input = "123/apple 456/orange";
string pattern = @"(?<!123/)apple";
Match match = Regex.Match(input, pattern);
Console.WriteLine(match.Value);
// Output: (no match found)
Regex in .NET: Tips for Seamless Interoperability in Your C# Projects
Regular expressions in C# are part of the .NET library, which means they are easily interoperable with other .NET languages and tools. Ensure that you’re familiar with the .NET regex syntax and follow established best practices when working in a multi-language environment.
This will help you maintain consistent code, reduce potential bugs, and ensure a seamless regex experience across your entire project.
For example, when working with VB.NET or F# developers, share your regex patterns and ensure everyone understands the syntax and structure of the patterns used in the project.
Use established naming conventions for the regex patterns and keep the patterns similar across all languages to make it easier for developers from different language backgrounds to read and understand them.
Regular Expressions C# Best Practices: Developing Clean, Efficient, and Readable Code
Take the time to develop clean, efficient, and readable regex code. Keep your patterns concise and maintainable to ensure long-term stability and efficiency.
Include comments and explanations for complex regex expressions to guide fellow developers, making it easier for them to understand and maintain the code.
As with all programming scenarios, following best practices is key to achieving optimal results with your C# regex implementation.
For example:
string pattern =
@"^ # Start of the line
(?<header>[\w\s]+) # Header (word and whitespace characters)
: # Literal colon separator
(?<content>.+?) # Content (any non-newline chars)
$ # End of the line";
This pattern demonstrates the use of comments to explain each portion of the regex pattern, making it easier for others (and your future self) to understand the purpose and behavior of the regex pattern.
Putting It All Together: C# Regex for Real-world Applications
As you’ve seen throughout this guide, C# regex can be a versatile and powerful tool for text manipulation in various real-world applications.
Let’s recap some practical use cases for regex in C# with examples to provide further insights.
Practical Use Cases for Regex in C Sharp
Here are a few example applications that can benefit from the power of regex in C#:
- Form validation and input sanitization for web applications:
Regex can be used to validate form fields in a web application, such as checking if an email address follows the correct format.
string emailPattern = @"\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b";
bool isValidEmail = Regex.IsMatch("john.doe@example.com", emailPattern, RegexOptions.IgnoreCase);
Console.WriteLine(isValidEmail); // Output: True
- Extracting and transforming data for data analysis or reporting:
Regex can be used to parse log files, for example, and extract useful information like error messages, timestamps and user data.
string logText = "2021-08-01 12:00:00 - ERROR - Could not connect to database.";
string regexPattern = @"\bERROR\b\s-\s(.+)";
Match match = Regex.Match(logText, regexPattern);
Console.WriteLine(match.Groups[1].Value); // Output: Could not connect to database.
- Web scraping and data mining:
Regex can be utilized to extract content from web pages, such as fetching all the links on a webpage.
string htmlText = "<a href=\"https://example1.com\">Example 1</a> <a href=\"https://example2.com\">Example 2</a>";
string linkPattern = @"<a\s+href=""([^""]+)""[^>]*>";
MatchCollection matches = Regex.Matches(htmlText, linkPattern);
foreach (Match match in matches)
{
Console.WriteLine(match.Groups[1].Value);
}
- Search functionality within a text editor or IDE:
Regex can be used to find specific patterns or strings in large code files or text documents, helping you quickly locate the information you need.
string code = "using System;\nnamespace HelloWorld{class Program{static void Main(string[] args){Console.WriteLine(\"Hello, World!\");}}}";
// Regex pattern to find "Console.WriteLine" method and find all matches
MatchCollection matches = Regex.Matches(code, @"Console\.WriteLine\(");
// Print the number of matches found
Console.WriteLine($"Found {matches.Count} matches.");
- Log file analysis and debugging:
By using regex patterns, you can parse log files to find specific error messages or occurrences, aiding in the debugging process.
string logContents = "2012-07-12 INFO Success\n2012-07-15 ERROR Failure";
string errorPattern = "^.*ERROR.*$";
MatchCollection errorMatches = Regex.Matches(logContents, errorPattern, RegexOptions.Multiline);
foreach (Match match in errorMatches)
{
Console.WriteLine(match.Value);
}
Using Regex C# in ASP.NET for Form Validation and Input Sanitization
Regex plays a vital role in form validation and input sanitization in web applications. Mastering regex in C# allows you to create robust and secure ASP.NET applications that efficiently validate user input, ensuring data integrity and preventing potential security issues.
For example, you can use regex in conjunction with Validator controls, such as RegularExpressionValidator
, to match a specific pattern in user-submitted input.
<asp:TextBox ID="emailTextBox" runat="server" />
<asp:RegularExpressionValidator ID="emailValidator" runat="server"
ControlToValidate="emailTextBox"
ErrorMessage="Invalid email format."
ValidationExpression="\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b">
</asp:RegularExpressionValidator>
C# Regular Expressions in Data Processing: Extracting and Transforming Text in Real-time
Regex is a game-changer when it comes to data processing. It empowers you to effortlessly extract and transform text data in real-time, simplifying complex data processing tasks and improving the overall efficiency of your applications.
For example, you might need to parse thousands of lines of text files and extract specific information, such as all email addresses within the text:
string input = "Contact Alice at alice@example.com and Bob at bob@example.org";
string emailPattern = @"\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b";
MatchCollection emailMatches = Regex.Matches(input, emailPattern, RegexOptions.IgnoreCase);
foreach (Match match in emailMatches)
{
Console.WriteLine(match.Value);
}
// Output:
// alice@example.com
// bob@example.org
Another example would be transforming formatted text, such as removing all HTML tags from a given text while preserving the content:
string htmlText = "<h1>Hello, world!</h1><p>This is <strong>bold</strong> text.</p>";
string htmlTagPattern = @"</?[^>]+>";
string plainText = Regex.Replace(htmlText, htmlTagPattern, string.Empty);
Console.WriteLine(plainText);
// Output:
// Hello, world!This is bold text.
As you delve deeper into the world of C# regex, you will discover countless areas of application that can benefit from the power and flexibility offered by regular expressions.
By mastering regex, you can tackle complex text manipulation tasks head-on, enhancing the performance and capabilities of your applications, and ultimately becoming a more effective and proficient C# developer.
Conclusion: Becoming a C# Regex Master
Throughout this guide, you’ve explored the world of C# regex, from basic syntax elements to advanced techniques. The possibilities are virtually limitless once you’ve mastered regex in C#.
Continue honing your regex skills and applying them to real-world applications to take full advantage of the power and flexibility that regular expressions in C# offer.
Happy regexing!
Top comments (2)
Having learned Regex, I can say it's intimidating at first but definitely worth it. I use it quite a lot these days in VS Code when doing Find/Replace - the fact that capture groups work in the Replace field (reference them by using
$1
,$2
, etc.) mean that it's possible to rewrite small bits of code quite quickly.For use inside code, it's quite handy for detecting URL portions, or finding GUIDs.
To test expressions, by favourite tools are:
the Find box in VS Code. Simply type an example of the target text in the editor, and use Find for real-time feedback of an expression.
regex101.com/ for more complex expressions.
I completely agree with you Anthony! Regex can indeed be intimidating at first, but once you get the hang of it, it opens up a whole new world of possibilities for text handling and manipulation. Also, your usage of Find/Replace in VS Code with capture groups is a great example of how Regex can make code editing more efficient.
Thanks for sharing your favorite tools for testing expressions!
The real-time feedback in VS Code's Find box is very helpful for rapid prototyping and testing.
Additionally, regex101.com is an excellent resource for more complex expressions and learning from other users' submissions!
Happy Regex-ing Anthony!🤗