Java Regular Expressions: A Comprehensive Guide with Examples and Best Practices

 

Table of Contents

1. Introduction to Regular Expressions
  • What are regular expressions?
  • Why use regular expressions in Java?
2. Basic Regex Syntax in Java
  • Characters and character classes
  • Anchors and boundaries
  • Quantifiers and alternation
  • Grouping and capturing
3. Pattern and Matcher Classes in Java
  • Using Pattern.compile() to create a regular expression pattern
  • Using Matcher.matches() to test a regex against an entire string
  • Using Matcher.find() and Matcher.group() to find and extract matches in a string
4. Common Regex Use Cases in Java
  • Validating date formats
  • Extracting email addresses
  • Splitting strings into words
  • Replacing text within a string
  • Matching URLs and email addresses
5. Best Practices for Using Regular Expressions in Java
  • Avoiding common regex pitfalls
  • Optimizing the performance of regex patterns
  • Writing maintainable and readable regex code
6. Conclusion and Further Resources
  • Recap of key concepts and techniques
  • Links to additional learning resources and tools.

    1. Introduction to Regular Expressions

    1.1. What are regular expressions?

    A regular expression, or regex for short, is a pattern of characters used to match and manipulate text. Regular expressions can be used for a wide variety of tasks, such as searching for specific words or phrases, validating data inputs, or replacing text with new values.

    In Java, regular expressions are supported through the java.util.regex package, which provides classes and methods for creating, compiling, and executing regex patterns.

    1.2. Why use regular expressions in Java?

    Using regular expressions in Java can provide a number of benefits:

    • More powerful and flexible text manipulation: Regular expressions can handle complex matching and replacement tasks that would be difficult or impossible with simple string manipulation functions.
    • Code simplification and readability: By encapsulating complex pattern-matching logic into a single regular expression, code can be made more concise and easier to understand.
    • Standardization and portability: Regular expressions provide a common syntax and API for pattern matching across different programming languages and platforms, making it easier to share code and collaborate with other developers.

    2. Basic Regex Syntax in Java

    2.1. Characters and Character Classes

    In a regular expression, each character represents itself, except for a few special characters that have special meanings. For example, the regular expression hello matches the string "hello" exactly, while the regular expression h.llo matches any string that has an "h", followed by any character, followed by "llo" (e.g. "hello", "hallo", "hxllo", etc.).

    In addition to individual characters, regular expressions can also use character classes to match sets of characters. For example, the character class [aeiou] matches any vowel, while the character class [0-9] matches any digit. Character classes can be negated using the ^ symbol, so [^aeiou] matches any non-vowel character.

    Example Code:

    java
    String text = "The quick brown fox jumps over the lazy dog."; String pattern = "[aeiou]"; // matches any vowel Pattern regex = Pattern.compile(pattern); Matcher matcher = regex.matcher(text); while (matcher.find()) { System.out.println("Match found: " + matcher.group()); }

    In this example,

    • We use a character class to match any vowel in the input string.
    • The pattern [aeiou] matches any one of the characters a, e, i, o, or u.
    • We then use a Matcher object to search for all occurrences of the pattern in the input string, and print each match to the console.

    2.2. Anchors and Boundaries

    Regular expressions can use anchors and boundaries to specify where a pattern should match within a string. The ^ character anchors the pattern to the beginning of the string, while the $ character anchors it to the end. For example, the regular expression ^hello matches any string that starts with "hello", while the regular expression world$ matches any string that ends with "world".

    Boundaries can also be used to match patterns that occur at word boundaries or non-word boundaries. The \b character matches a word boundary (i.e. the transition between a word character and a non-word character), while \B matches a non-word boundary (i.e. the transition between two-word characters or two non-word characters).

    Example Code:

    java
    String text = "The quick brown fox jumps over the lazy dog."; String pattern = "^The.*dog\\.$"; // matches strings that start with "The" and end with "dog." Pattern regex = Pattern.compile(pattern); Matcher matcher = regex.matcher(text); if (matcher.find()) { System.out.println("Match found: " + matcher.group()); }

    In this example,

    • we use the ^ and $ anchors to match strings that start with "The" and end with "dog.", respectively.
    • The .* in the middle matches any number of characters between "The" and "dog."
    • We then use a Matcher object to search for a single occurrence of the pattern in the input string, and print the match to the console.

    2.3. Quantifiers and Alternation

    Regular expressions can use quantifiers to specify how many times a pattern should match. The * character matches zero or more occurrences of the preceding pattern, while the + character matches one or more occurrences. The ? character matches zero or one occurrence of the preceding pattern.

    Quantifiers can also be specified with a minimum and maximum number of occurrences using the {} syntax. For example, the pattern a{3,5} matches "aaa", "aaaa", or "aaaaa", but not "aa" or "aaaaaa".

    Regular expressions can also use alternation to match multiple patterns. The | character specifies a choice between two patterns. For example, the pattern cat|dog matches either "cat" or "dog".

    Example Code:

    java
    String text = "The quick brown fox jumps over the lazy dog."; String pattern = "q.*k|o.*o"; // matches "quick" or "over" Pattern regex = Pattern.compile(pattern); Matcher matcher = regex.matcher(text); if (matcher.find()) { System.out.println("Match found: " + matcher.group()); }

    In this example,

    • We use the | alternation operator to match either "q.*k" or "o.*o".
    • The .* quantifier matches any number of characters between "q" and "k" or "o" and "o".
    • We then use a Matcher object to search for a single occurrence of the pattern in the input string, and print the match to the console.

    2.4. Grouping and Capturing

    Regular expressions can use grouping and capturing to extract specific parts of a matched pattern. Parentheses () can be used to group parts of a pattern together, and the matched text within each group can be accessed using capturing groups. Capturing groups are numbered sequentially, starting with 1.

    For example, the pattern (ab)+ matches one or more occurrences of the sequence "ab", and the text matched by the first capturing group can be accessed using the method group(1) on a Matcher object.

    Example Code:

    java
    String text = "John Doe, 123 Main St., Anytown, USA"; String pattern = "(\\w+) (\\w+), (\\d+) (\\w+\\.?), (\\w+), (\\w+)"; Pattern regex = Pattern.compile(pattern); Matcher matcher = regex.matcher(text); if (matcher.find()) { System.out.println("Match found: " + matcher.group(0)); // full match System.out.println("First name: " + matcher.group(1)); // first name System.out.println("Last name: " + matcher.group(2)); // last name System.out.println("Street number: " + matcher.group(3)); // street number System.out.println("Street name: " + matcher.group(4)); // street name System.out.println("City: " + matcher.group(5)); // city System.out.println("Country: " + matcher.group(6)); // country }

    In this example,

    • We use parentheses to group parts of the pattern and capture them as separate groups.
    • The \\w+ pattern matches one or more word characters (letters, digits, or underscores).
    • We then use a Matcher object to search for a single occurrence of the pattern in the input string,

    2.5. Escaping Special Characters

    In a regular expression, certain characters have special meanings and are used to represent metacharacters or character classes. To match these characters literally, they need to be escaped using the backslash \ character.

    For example, the regular expression . matches any character except for a line break, while the regular expression \. matches a literal period character.

    swift
    String input = "This is a test string with special characters: $^.*+?"; String regex = "\\$\\^\\.\\*\\+\\?"; String output = input.replaceAll(regex, ""); System.out.println("Input string: " + input); System.out.println("Regex pattern: " + regex); System.out.println("Output string: " + output);

    In this example,

    1. We have a test string input that contains special characters like $, ^, ., *, +, and ?. We want to remove these characters from the string using the replaceAll() method.

    2. To do this, we need to escape each special character with a backslash \, which tells the regex engine to treat it as a literal character instead of a special character. We create a regex pattern regex that matches each of the special characters and escape them with a backslash.

    3. We then use the replaceAll() method to replace all occurrences of the regex pattern with an empty string, effectively removing the special characters from the input string.

    4. Finally, we print out the input string, regex pattern, and output string using the println() method.

    When we run this code, we get the following output:

    csharp
    Input string: This is a test string with special characters: $^.*+? Regex pattern: \$\^\.\*\+\? Output string: This is a test string with special characters:

    As we can see, the special characters have been successfully removed from the input string, leaving only plain text. By escaping special characters properly, we can ensure that our regular expressions work as expected and avoid unexpected results.


    3. Pattern and Matcher Classes in Java

    3.1. Pattern Class:

    The Pattern class is used to create a regular expression pattern. To create a pattern, you can use the static compile() method of the Pattern class. This method takes a string argument that represents the regular expression pattern.

    Here's an example:

    mathematica
    String regex = "[a-z]+"; Pattern pattern = Pattern.compile(regex);

    This creates a pattern that matches one or more lowercase letters.

    3.2. Matcher Class:

    The Matcher class is used to match a regular expression pattern against a string. To create a matcher, you can call the matcher() method of the Pattern class. This method takes a string argument that represents the string you want to match against.

    Here's an example:

    arduino
    String regex = "[a-z]+"; String text = "hello world"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(text);

    This creates a matcher that will match the pattern against the string "hello world".

    3.3. Using Matcher.matches():

    The matches() method of the Matcher class can be used to test a regex against an entire string. This method returns a boolean value indicating whether the entire string matches the regex.

    Here's an example:

    arduino
    String regex = "[a-z]+"; String text = "hello world"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(text); if (matcher.matches()) { System.out.println("The string matches the regex!"); } else { System.out.println("The string does not match the regex."); }

    3.4. Using Matcher.find() and Matcher.group():

    The find() method of the Matcher class can be used to find the next match in a string. This method returns a boolean value indicating whether a match was found. The group() method can be used to extract the matched text.

    Here's an example:

    vbnet
    String regex = "[a-z]+"; String text = "hello world"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(text); while (matcher.find()) { String match = matcher.group(); System.out.println("Match: " + match); }

    This will find all matches of the regex in the string "hello world" and print them out.


    4. Using Regular Expressions in Java

    4.1. Creating a regex pattern

    In Java, regular expressions are represented using the Pattern class, which provides methods for creating and compiling regex patterns. To create a Pattern object, simply call the static compile method on the Pattern class and pass in the regex pattern as a string.

    java
    Pattern pattern = Pattern.compile("hello");

    4.2. Matching a regex pattern

    To match a regex pattern against a string in Java, use the Matcher class. The Matcher class provides methods for finding matches within a string, as well as accessing the matched text and capturing groups.

    To create a Matcher object, call the matcher method on the Pattern object and pass in the string to match.

    java
    Matcher matcher = pattern.matcher("hello world");

    To find the next match within the string, call the find method on the Matcher object. The find method returns true if a match is found, and false otherwise.

    java
    if (matcher.find()) { System.out.println("Match found!"); }

    To access the matched text, use the group method on the Matcher object. The group method returns the entire matched text by default, but can also be used to access specific capturing groups by passing in the group number.

    java
    String matchedText = matcher.group();

    4.3. Examples of Using Regular Expressions in Java

    Example 1: Validating a Date Format

    One common use case for regular expressions is to validate user input. For example, we might want to ensure that a user's input for a date field is in the correct format (e.g. "YYYY-MM-DD").

    To validate a date format using a regular expression in Java, we can use the following pattern:

    java
    Pattern datePattern = Pattern.compile("^\\d{4}-\\d{2}-\\d{2}$");

    This pattern matches any string that starts with four digits, followed by a hyphen, followed by two more digits, another hyphen, and two final digits. The ^ and $ anchors ensure that the pattern matches the entire string, rather than just a portion of it.

    We can then use this pattern to validate a user's input as follows:

    java
    String input = "2022-05-02"; Matcher dateMatcher = datePattern.matcher(input); if (dateMatcher.matches()) { System.out.println("Input is a valid date!"); } else { System.out.println("Input is not a valid date."); }

    If the user inputs "2022-05-02", this code will output "Input is a valid date!".

    Example 2: Extracting Email Addresses from Text

    Another common use case for regular expressions is to extract specific pieces of information from text. For example, we might want to extract all of the email addresses from a block of text.

    To extract email addresses using a regular expression in Java, we can use the following pattern:


    java
    Pattern emailPattern = Pattern.compile("\\b[\\w.%-]+@[\\w.-]+\\.[a-zA-Z]{2,}\\b");

    This pattern matches any string that contains an email address. It starts by matching one or more word characters, as well as the characters .%-, followed by an @ symbol, then one or more word characters and hyphens, followed by a period and two or more letters.

    We can then use this pattern to extract all email addresses from a block of text as follows:

    java
    String text = "Here are some example email addresses: [email protected], [email protected], and [email protected]."; Matcher emailMatcher = emailPattern.matcher(text); while (emailMatcher.find()) { String email = emailMatcher.group(); System.out.println("Found email: " + email); }

    This code will output:

    graphql
    Found email: john@example.com Found email: jane.doe@example.co.uk Found email: bob.smith@example.net

    Example 3: Replacing Text with Regular Expressions

    Another use case for regular expressions in Java is to replace text that matches a certain pattern with other text. For example, we might want to replace all instances of a word with a different word.

    To replace text using a regular expression in Java, we can use the replaceAll method on a string, which takes a regular expression pattern as the first argument and the replacement text as the second argument.

    java
    String text = "The quick brown fox jumps over the lazy dog."; String newText = text.replaceAll("\\bfox\\b", "cat"); System.out.println(newText);

    This code will output "The quick brown cat jumps over the lazy dog." Here, we use the \b metacharacter to match the word boundaries before and after "fox", to ensure that we only replace the word "fox" and not a substring like "foxy".

    We then pass the replacement string "cat" as the second argument to the replaceAll method.

    We can also use regular expressions to extract specific parts of a string and use them in the replacement string. For example, we might want to extract the domain name from an email address and use it to create a new email address with a different domain.

    java
    String email = "[email protected]"; String newEmail = email.replaceAll("@[\\w.-]+\\.[a-zA-Z]{2,}$", "@newdomain.com"); System.out.println(newEmail);

    This code will output "[email protected]". Here, we use a regular expression pattern to match the domain name in the email address, and we use it in the replacement string to create a new email address with the same username but a different domain name.

    Example 4: Splitting Strings with Regular Expressions

    In addition to matching and replacing text with regular expressions in Java, we can also use them to split strings into arrays of substrings based on a certain pattern. For example, we might want to split a string into an array of words based on whitespace characters.

    To split a string using a regular expression in Java, we can use the split method on a string, which takes a regular expression pattern as the argument.

    java
    String text = "The quick brown fox jumps over the lazy dog."; String[] words = text.split("\\s+"); for (String word : words) { System.out.println(word); }

    This code will output:

    sql
    The quick brown fox jumps over the lazy dog.

    Here, we use the \s+ regular expression pattern to match one or more whitespace characters, and we use it as the argument to the split method. The method returns an array of substrings that are separated by the pattern.

    We can also use regular expressions to split a string into an array of substrings based on more complex patterns, such as punctuation marks or regular intervals.

    Here are some other examples of how regular expressions can be used:

    1. Match a specific string:

    arduino
    String regex = "hello"; String input = "hello world"; boolean match = input.matches(regex);

    In this example,

    • we define a regular expression that matches the string "hello".
    • We then test whether the input string "hello world" matches the regular expression.
    • The result of the match will be true.

    2. Match any digit:

    java
    String regex = "\\d"; String input = "abc123def"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(input); while (matcher.find()) { System.out.println(matcher.group()); }

    In this example,

    • we define a regular expression that matches any digit.
    • We then compile the regular expression into a pattern and create a matcher object to test against an input string.
    • We use a while loop to find all matches in the input string and print them out.
    • The result of this code will be:

    1 2 3

    3. Match an email address:

    arduino
    String regex = "^[\\w.-]+@[\\w.-]+\\.[a-zA-Z]{2,6}$"; String input = "[email protected]"; boolean match = input.matches(regex);

    In this example,

    • we define a regular expression that matches an email address.
    • The regular expression starts with the "^" character to indicate the beginning of the string and ends with the "$" character to indicate the end of the string.
    • The regular expression then matches one or more word characters, dots or hyphens, followed by an "@" symbol, followed by one or more word characters, dots or hyphens, followed by a period and two to six alphabetic characters.
    • We then test whether the input string "[email protected]" matches the regular expression. The result of the match will be true.

    These are just a few examples of how regular expressions can be used in Java. Regular expressions can be used for a wide variety of tasks, such as validating input, searching and replacing text, and parsing data.


    4. Replace specific characters in a string:

    arduino
    String regex = "[aeiou]"; String input = "hello world"; String replaced = input.replaceAll(regex, "*"); System.out.println(replaced);

    In this example,

    • we define a regular expression that matches any vowel character.
    • We then use the replaceAll() method to replace all instances of vowels in the input string with an asterisk.
    • The result of this code will be:

    markdown
    h*ll* w*rld

    5. Match multiple options:

    arduino
    String regex = "red|blue|green"; String input = "The sky is blue"; boolean match = input.matches(regex);

    In this example,

    • we define a regular expression that matches the words "red", "blue", or "green".
    • We then test whether the input string "The sky is blue" matches the regular expression.
    • The result of the match will be true, because "blue" is one of the options in the regular expression.

    6. Match a URL:

    arduino
    String regex = "^https?://[\\w\\d.-]+/?.*$"; String input = "https://www.example.com/index.html"; boolean match = input.matches(regex);

    In this example,

    • we define a regular expression that matches a URL starting with "http://" or "https://".
    • The regular expression then matches one or more word characters, digits, dots, or hyphens, followed by an optional slash and any additional characters.
    • We then test whether the input string "https://www.example.com/index.html" matches the regular expression.
    • The result of the match will be true.

    These are just a few examples of how regular expressions can be used in Java. Regular expressions can be quite powerful and flexible, but can also be complex to write and understand. It is important to test regular expressions thoroughly and ensure they are working as intended.


    7. Match a specific number of characters:

    arduino
    String regex = "^\\d{3}-\\d{2}-\\d{4}$"; String input = "123-45-6789"; boolean match = input.matches(regex);

    In this example,

    • we define a regular expression that matches a social security number in the format "###-##-####", where each "#" represents a digit.
    • The regular expression uses curly braces to indicate that each section of the social security number must contain a specific number of digits.
    • We then test whether the input string "123-45-6789" matches the regular expression.
    • The result of the match will be true.

    8. Match whitespace characters:

    java
    String regex = "\\s"; String input = "Hello\nworld\t!"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(input); while (matcher.find()) { System.out.println(matcher.group()); }

    In this example,

    • we define a regular expression that matches any whitespace character, including spaces, tabs, and newlines.
    • We then compile the regular expression into a pattern and create a matcher object to test against an input string.
    • We use a while loop to find all matches in the input string and print them out. The result of this code will be:

    \n \t

    9. Match a phone number:

    scss
    String regex = "^\\(?(\\d{3})\\)?[- ]?(\\d{3})[- ]?(\\d{4})$"; String input = "(123) 456-7890"; boolean match = input.matches(regex);

    In this example,

    • we define a regular expression that matches a phone number in various formats, including "(123) 456-7890" and "123-456-7890".
    • The regular expression uses parentheses and question marks to indicate optional parts of the phone number, such as the area code.
    • We then test whether the input string "(123) 456-7890" matches the regular expression. The result of the match will be true.

    These examples demonstrate the versatility and power of regular expressions in Java. Regular expressions can be used in a wide variety of applications, such as validating user input, parsing data, and manipulating text. While they can be complex to write and understand, regular expressions can also provide an elegant solution to many programming problems.


    10. Match a specific word or phrase:

    java
    String regex = "\\bworld\\b"; String input = "Hello world!"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(input); while (matcher.find()) { System.out.println(matcher.group()); }

    In this example,

    • we define a regular expression that matches the word "world" only when it appears as a separate word, surrounded by whitespace or punctuation.
    • We then compile the regular expression into a pattern and create a matcher object to test against an input string.
    • We use a while loop to find all matches in the input string and print them out. The result of this code will be:

    world

    11. Extract email addresses from a string:

    java
    String regex = "[\\w-]+@[\\w-]+\\.[\\w]+"; String input = "Contact us at [email protected] or [email protected]"; Pattern pattern = Pattern.compile(regex); Matcher matcher = pattern.matcher(input); while (matcher.find()) { System.out.println(matcher.group()); }

    In this example,

    • we define a regular expression that matches email addresses in the standard format, such as "[email protected]".
    • We then compile the regular expression into a pattern and create a matcher object to test against an input string.
    • We use a while loop to find all matches in the input string and print them out. The result of this code will be:

    graphql
    info@example.com sales@example.com

    12. Split a string into words:

    arduino
    String regex = "\\s+"; String input = "The quick brown fox jumps over the lazy dog"; String[] words = input.split(regex); for (String word : words) { System.out.println(word); }

    In this example,

    • we define a regular expression that matches one or more whitespace characters.
    • We then use the split() method to split the input string into an array of words, using the regular expression as the delimiter.
    • We then iterate over the array and print each word on a separate line. The result of this code will be:

    sql
    The quick brown fox jumps over the lazy dog

    These examples illustrate some common uses of regular expressions in Java, but there are many other possibilities. By mastering regular expressions, you can greatly expand your abilities as a Java programmer and solve complex programming challenges with elegant and efficient solutions.


    13. Replace text within a string:

    arduino
    String regex = "\\bcat\\b"; String input = "I have a cat named Mittens"; String replacement = "dog"; String output = input.replaceAll(regex, replacement); System.out.println(output);

    In this example,

    • we define a regular expression that matches the word "cat" only when it appears as a separate word, surrounded by whitespace or punctuation.
    • We then use the replaceAll() method to replace all instances of the matched text with the word "dog".
    • The result of this code will be:

    css
    I have a dog named Mittens


    5. Best Practices for Using Regular Expressions in Java

    We will cover some best practices for using regular expressions in Java, including avoiding common pitfalls, optimizing performance, and writing maintainable and readable code.

    5.1. Avoiding Common Regex Pitfalls:

    Regular expressions can be tricky to get right, and even experienced developers can make mistakes. Here are some common pitfalls to watch out for:

    • Greedy quantifiers: Greedy quantifiers like the * and + operators can cause performance problems and even crashes if they match too much text. Use lazy quantifiers like *? and +? when possible to limit the amount of text matched.
    • Backtracking: Regular expressions can backtrack when they encounter a failure, which can cause performance problems and even stack overflows if the pattern is too complex. Avoid using look-around and alternations inside of groups, and try to write patterns that match from left to right.
    • Incorrect character sets: Character sets like [] and \w can match unexpected characters if they aren't properly escaped. Always escape special characters with a backslash when using them in a regular expression.

    5.2. Optimizing Regex Performance:

    Regular expressions can be slow if they're not optimized for performance. Here are some tips for writing high-performance regex patterns:

    • Use anchors: Anchors like ^ and $ can limit the amount of text that needs to be matched and improve performance.
    • Use character classes: Character classes like [a-z] and \d can match specific sets of characters more efficiently than using alternations.
    • Avoid look-around: Look-around can cause the regular expression engine to backtrack and re-evaluate parts of the pattern, which can be slow. Use them sparingly and only when necessary.
    • Compile patterns once: Regular expression patterns can be compiled once and reused multiple times, which can improve performance.

    5.3. Writing Maintainable and Readable Regex Code:

    Regular expressions can be difficult to read and understand, especially for developers who are not familiar with them. Here are some tips for writing maintainable and readable regex code:

    • Use comments: Regular expressions can be hard to read, so add comments to explain what each part of the pattern is doing.
    • Break up patterns into smaller pieces: Long patterns can be difficult to read, so break them up into smaller, more manageable pieces.
    • Use named capture groups: Named capture groups like (?<name>) can make it easier to understand the purpose of each group in the pattern.
    • Test and debug patterns: Regular expressions can be tricky to get right, so test and debug your patterns using tools like RegexPlanet or an online regex tester.

    6. Conclusion

    In this tutorial, we covered the basics of regular expressions in Java, including character classes, anchors, quantifiers, alternation, grouping, capturing, and more. We also learned about best practices for using regular expressions, such as avoiding common pitfalls, optimizing performance, and writing maintainable and readable code.

    Regular expressions are a powerful tool for pattern matching and text manipulation in Java and can be used in a wide variety of applications. By understanding the syntax and features of regular expressions, we can write more effective and efficient code.


    Author
    Vaneesh Behl
    Passionately writing and working in Tech Space for more than a decade.

    Comments

    Popular posts from this blog

    Automation Practice: Automate Amazon like E-Commerce Website with Selenium

    17 Best Demo Websites for Automation Testing Practice

    14 Best Selenium Practice Exercises for Automation Practice

    Selenium IDE Tutorial: How to Automate Web Testing with Easy-to-Use Interface

    Python Behave Tutorial: A Comprehensive Guide to Behavior-Driven Development (BDD)

    How to Automate Google Search with Selenium WebDriver

    Top 10 Highly Paid Indian CEOs in the USA

    Mastering Selenium Practice: Automating Web Tables with Demo Examples

    Mastering Selenium WebDriver: 25+ Essential Commands for Effective Web Testing

    Find Broken Links on Webpage with Selenium Automation