I have two regular expressions, one pulling out usernames from a csv string, and the other pulling out emails.
the string format is like this:
String s = "name lastname (username) <[email protected]>; name lastname (username) <[email protected]>; name lastname (username) <[email protected]>";
the code for my regular expressions are like this.
Pattern pattern = Pattern.compile("(?<=\\()[^\\)]+");
Matcher matcher = pattern.matcher(s);
Pattern pattern2 = Pattern.compile("((?<=<)[^>]+)");
Matcher matcher2 = pattern2.matcher(s);
while (matcher.find() && matcher2.find()) {
System.out.println(matcher.group() + " " + matcher2.group());
}
I've found several qeustions about merging regexes, but from the answers i haven't been able to figure out how to merge mine.
my printouts show:
"username [email protected]"
would I be able to print out the same from a single matcher, using one regex?
obs: this is a school assignment, which means i do not "need" to merge them or do any more, but i'd like to know if it is possible, and how difficult it would be.
Combining the regex for the fourth option with any of the others doesn't work within one regex. 4 + 1 would mean either the string starts with @ or doesn't contain @ at all. You're going to need two separate comparisons to do that. Thanks for contributing an answer to Stack Overflow!
The concatenation of Regex in the programming world can be understood as combining text patterns to obtain a new text pattern, such as “Hello” + “World” is /HelloWorld/. Whenever RegExp () is called, it creates a new RegExp object. Example 1: This example creating an expression without actually using the Regex literal syntax.
Whenever RegExp () is called, it creates a new RegExp object. Example 1: This example creating an expression without actually using the Regex literal syntax. This allows you to make arbitrary string manipulation before it becomes a Regex object.
to obtain a new text pattern, such as “Hello” + “World” is /HelloWorld/. Whenever RegExp () is called, it creates a new RegExp object. Example 1: This example creating an expression without actually using the Regex literal syntax. This allows you to make arbitrary string manipulation before it becomes a Regex object.
You can just use an Pipe (|)
in between your multiple Regex
, to match all of them : -
String s = "name lastname (username) <[email protected]>; name lastname
(username) <[email protected]>; name lastname
(username) <[email protected]>;";
// Matches (?<=\\()[^\\)]+ or ((?<=<)[^>]+)
Pattern pattern = Pattern.compile("(?<=\\()[^\\)]+|((?<=<)[^>]+)");
Matcher matcher = pattern.matcher(s);
while (matcher.find()) {
System.out.println(matcher.group());
}
OUTPUT: -
username
[email protected]
username
[email protected]
username
[email protected]
UPDATE: -
If you want to print username
and email
only when they both exists, then you need to split your string on ;
and then apply the below Regex on each of them.
Here's the code: -
String s = "name lastname (username) ;
name lastname (username) <[email protected]>;
name lastname (username) <[email protected]>;";
String [] strArr = s.split(";");
for (String str: strArr) {
Pattern pattern = Pattern.compile("\\(([^\\)]+)(?:\\))\\s(?:\\<)((?<=<)[^>]+)");
Matcher matcher = pattern.matcher(str);
while (matcher.find()) {
System.out.print(matcher.group(1) + " " + matcher.group(2));
}
System.out.println();
}
OUTPUT: -
username [email protected]
username [email protected] // Only the last two have both username and email
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With