import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String[] args) {
final String regex = "(?(DEFINE)
\n"
+ " (?<addr_spec> (?&local_part) @ (?&domain) )
\n"
+ " (?<local_part> (?&dot_atom) | (?"ed_string) | (?&obs_local_part) )
\n"
+ " (?<domain> (?&dot_atom) | (?&domain_literal) | (?&obs_domain) )
\n"
+ " (?<domain_literal> (?&CFWS)? \\[ (?: (?&FWS)? (?&dtext) )* (?&FWS)? \\] (?&CFWS)? )
\n"
+ " (?<dtext> [\\x21-\\x5a] | [\\x5e-\\x7e] | (?&obs_dtext) )
\n"
+ " (?<quoted_pair> \\\\ (?: (?&VCHAR) | (?&WSP) ) | (?&obs_qp) )
\n"
+ " (?<dot_atom> (?&CFWS)? (?&dot_atom_text) (?&CFWS)? )
\n"
+ " (?<dot_atom_text> (?&atext) (?: \\. (?&atext) )* )
\n"
+ " (?<atext> [a-zA-Z0-9!#$%&'*+\\/=?^_`\\{|\\}~-]+ )
\n"
+ " (?<atom> (?&CFWS)? (?&atext) (?&CFWS)? )
\n"
+ " (?<word> (?&atom) | (?"ed_string) )
\n"
+ " (?<quoted_string> (?&CFWS)? \" (?: (?&FWS)? (?&qcontent) )* (?&FWS)? \" (?&CFWS)? )
\n"
+ " (?<qcontent> (?&qtext) | (?"ed_pair) )
\n"
+ " (?<qtext> \\x21 | [\\x23-\\x5b] | [\\x5d-\\x7e] | (?&obs_qtext) )
\n"
+ " # comments and whitespace
\n"
+ " (?<FWS> (?: (?&WSP)* \\r\\n )? (?&WSP)+ | (?&obs_FWS) )
\n"
+ " (?<CFWS> (?: (?&FWS)? (?&comment) )+ (?&FWS)? | (?&FWS) )
\n"
+ " (?<comment> \\( (?: (?&FWS)? (?&ccontent) )* (?&FWS)? \\) )
\n"
+ " (?<ccontent> (?&ctext) | (?"ed_pair) | (?&comment) )
\n"
+ " (?<ctext> [\\x21-\\x27] | [\\x2a-\\x5b] | [\\x5d-\\x7e] | (?&obs_ctext) )
\n"
+ " # obsolete tokens
\n"
+ " (?<obs_domain> (?&atom) (?: \\. (?&atom) )* )
\n"
+ " (?<obs_local_part> (?&word) (?: \\. (?&word) )* )
\n"
+ " (?<obs_dtext> (?&obs_NO_WS_CTL) | (?"ed_pair) )
\n"
+ " (?<obs_qp> \\\\ (?: \\x00 | (?&obs_NO_WS_CTL) | \\n | \\r ) )
\n"
+ " (?<obs_FWS> (?&WSP)+ (?: \\r\\n (?&WSP)+ )* )
\n"
+ " (?<obs_ctext> (?&obs_NO_WS_CTL) )
\n"
+ " (?<obs_qtext> (?&obs_NO_WS_CTL) )
\n"
+ " (?<obs_NO_WS_CTL> [\\x01-\\x08] | \\x0b | \\x0c | [\\x0e-\\x1f] | \\x7f )
\n"
+ " # character class definitions
\n"
+ " (?<VCHAR> [\\x21-\\x7E] )
\n"
+ " (?<WSP> [ \\t] )
\n"
+ ")
\n"
+ "^(?&addr_spec)$";
final String string = " Valid\n"
+ "-------\n"
+ "first.last@iana.org\n"
+ "1234567890123456789012345678901234567890123456789012345678901234@iana.org\n"
+ "\"first\\\"last\"@iana.org\n"
+ "\"first@last\"@iana.org\n"
+ "\"first\\\\last\"@iana.org\n"
+ "x@x23456789.x23456789.x23456789.x23456789.x23456789.x23456789.x23456789.x23456789.x23456789.x23456789.x23456789.x23456789.x23456789.x23456789.x23456789.x23456789.x23456789.x23456789.x23456789.x23456789.x23456789.x23456789.x23456789.x23456789.x23456789.x2\n"
+ "1234567890123456789012345678901234567890123456789012345678@12345678901234567890123456789012345678901234567890123456789.12345678901234567890123456789012345678901234567890123456789.123456789012345678901234567890123456789012345678901234567890123.iana.org\n"
+ "first.last@[12.34.56.78]\n"
+ "first.last@[IPv6:::12.34.56.78]\n"
+ "first.last@[IPv6:::b3:b4]\n"
+ "first.last@[IPv6:::]\n"
+ "first.last@[IPv6:1111:2222:3333::4444:12.34.56.78]\n"
+ "\"first\\last\"@iana.org\n"
+ "user+mailbox@iana.org\n"
+ "customer/department@iana.org \n"
+ "customer/department=shipping@iana.org\n"
+ "\"Doug \\\"Ace\\\" L.\"@iana.org\n"
+ "+1~1+@iana.org\n"
+ "{_test_}@iana.org\n"
+ "\"[[ test ]]\"@iana.org\n"
+ "\"test blah\"@iana.org\n"
+ "(foo)cal(bar)@(baz)iamcal.com(quux)\n"
+ "cal(woo(yay)hoopla)@iamcal.com\n"
+ "cal(foo\\@bar)@iamcal.com\n"
+ "cal(foo\\)bar)@iamcal.com\n"
+ "first(Welcome to the (\"wonderful\" (!)) world of email)@iana.org\n"
+ "pete(his account)@silly.test(his host)\n"
+ "c@(Chris's host.)public.example\n\n"
+ " Invalid\n"
+ "---------\n"
+ "first@...........com\n"
+ "first.last@sub.do,com\n"
+ "first\\@last@iana.org\n"
+ "first.last\n"
+ ".first.last@iana.org\n"
+ "first.last.@iana.org\n"
+ "\"first\"last\"@iana.org\n"
+ "\"\"\"@iana.org\n"
+ "first\\\\@last@iana.org\n"
+ "Doug\\ \\\"Ace\\\"\\ Lovell@iana.org\n"
+ "()[]\\;:,><@iana.org\n"
+ "test@.\n"
+ "test@[123.123.123.123\n"
+ "test@123.123.123.123]\n\n";
final Pattern pattern = Pattern.compile(regex, Pattern.COMMENTS | Pattern.MULTILINE);
final Matcher matcher = pattern.matcher(string);
while (matcher.find()) {
System.out.println("Full match: " + matcher.group(0));
for (int i = 1; i <= matcher.groupCount(); i++) {
System.out.println("Group " + i + ": " + matcher.group(i));
}
}
}
}
Please keep in mind that these code samples are automatically generated and are not guaranteed to work. If you find any syntax errors, feel free to submit a bug report. For a full regex reference for Java, please visit: https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html