var email = "john.doe@example.com";
var name = email.substring(0, email.lastIndexOf("@"));
var domain = email.substring(email.lastIndexOf("@") +1);
console.log( name ); // john.doe
console.log( domain ); // example.com
The above will also work for valid names containing @ (tools.ietf.org/html/rfc3696Page 5):
john@doe
“john@@”.doe
“j@hn”.d@e
- String.prototype.substring()
- String.prototype.lastIndexOf()
Using RegExp:
Given the email value is already validated, String.prototype.match() can be than used to retrieve the desired name, domain:
String match:
const name = email.match(/^.+(?=@)/)[0];
const domain = email.match(/(?<=.+@)[^@]+$/)[0];
Capturing Group:
const name = email.match(/(.+)@/)[1];
const domain = email.match(/.+@(.+)/)[1];
To get both fragments in an Array, use String.prototype.split() to split the string at the last @ character:
const [name, domain] = email.split(/(?<=^.+)@(?=[^@]+$)/);
console.log(name, domain);
or simply with /@(?=[^@]*$)/.
Here’s an example that uses a reusable function getEmailFragments( String )
const getEmailFragments = (email) => email.split(/@(?=[^@]*$)/);
[ // LIST OF VALID EMAILS:
`info@example.com`,
`john@doe@example.com`,
`"john@@".doe@example.com`,
`"j@hn".d@e@example.com`,
]
.forEach(email => {
const [name, domain] = getEmailFragments(email);
console.log("DOMAIN: %s NAME: %s ", domain, name);
});