emailAddress property
FluentRegex
emailAddress
======================================================================== DEFAULT EXPRESSIONS
Implementation
// TODO standard expressions such as URI, URL, XML_ELEMENT, ETC
// Parsing email addresses based on the RFC 5322 standard:
//
// (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*
// | "(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]
// | \\[\x01-\x09\x0b\x0c\x0e-\x7f])*")
// @ (?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
// | \[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}
// (?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:
// (?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]
// | \\[\x01-\x09\x0b\x0c\x0e-\x7f])+)
// \])
FluentRegex get emailAddress {
var nameSet = CharacterSet()
.addLetters()
.addDigits()
.addLiterals("\$!#%&'*+/=?^_`{|}~-");
// (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*
var name = FluentRegex()
.characterSet(nameSet, Quantity.oneOrMoreTimes())
.group(
FluentRegex()
.literal('.')
.characterSet(nameSet, Quantity.oneOrMoreTimes()),
quantity: Quantity.zeroOrMoreTimes());
var quotedNameSet1 = CharacterSet()
.addRange('\x01', '\x08')
.addLiterals('\x0b\x0c')
.addRange('\x0e', '\x1f')
.addLiterals('\x21')
.addRange('\x23', '\x5b')
.addRange('\x5d', '\x7f');
var quotedNameSet2 = CharacterSet()
.addRange('\x01', '\x09')
.addLiterals('\x0b\x0c')
.addRange('\x0e', '\x7f');
// "(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f] | \\[\x01-\x09\x0b\x0c\x0e-\x7f])*")
var quotedName = FluentRegex().literal('"').or([
FluentRegex().characterSet(quotedNameSet1),
FluentRegex().literal('\\').characterSet(quotedNameSet2),
], Quantity.zeroOrMoreTimes()).literal('"');
//[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?
var domainName = FluentRegex()
.characterSet(CharacterSet().addLetters().addDigits())
.group(
FluentRegex()
.characterSet(
CharacterSet().addLetters().addDigits().addLiterals('-'),
Quantity.zeroOrMoreTimes())
.characterSet(CharacterSet().addLetters().addDigits(),
Quantity.zeroOrOneTime())
.literal('.'),
quantity: Quantity.oneOrMoreTimes())
.characterSet(CharacterSet().addLetters().addDigits())
.group(
FluentRegex()
.characterSet(
CharacterSet().addLetters().addDigits().addLiterals('-'),
Quantity.zeroOrMoreTimes())
.characterSet(CharacterSet().addLetters().addDigits()),
quantity: Quantity.zeroOrOneTime());
//25[0-5]
var ipAddressByte1 = FluentRegex()
.literal('25')
.characterSet(CharacterSet().addRange('0', '5'));
//2[0-4][0-9]
var ipAddressByte2 = FluentRegex()
.literal('2')
.characterSet(CharacterSet().addRange('0', '4'))
.characterSet(CharacterSet().addDigits());
//[01]?[0-9][0-9]?
var ipAddressByte3 = FluentRegex()
.characterSet(
CharacterSet().addLiterals('01'), Quantity.zeroOrOneTime())
.characterSet(CharacterSet().addDigits())
.characterSet(CharacterSet().addDigits(), Quantity.zeroOrOneTime());
// [a-z0-9-]*[a-z0-9]:
// (?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]
// | \\[\x01-\x09\x0b\x0c\x0e-\x7f])+)
var ipAddressSuffix = FluentRegex()
.characterSet(CharacterSet().addLetters().addDigits().addLiterals('-'),
Quantity.zeroOrMoreTimes())
.characterSet(CharacterSet().addLetters().addDigits())
.literal(':')
.or([
FluentRegex().characterSet(CharacterSet()
.addRange('\x01', '\x08')
.addLiterals('\x0b\x0c')
.addRange('\x0e', '\x1f')
.addRange('\x21', '\x5a')
.addRange('\x53', '\x7f')),
FluentRegex().literal('\\').characterSet(
CharacterSet()
.addRange('\x01', '\x09')
.addLiterals('\x0b\x0c')
.addRange('\x0e', '\x7f'),
Quantity.oneOrMoreTimes()),
]);
var domainAddress = FluentRegex()
.literal('[')
.group(
FluentRegex().or([
ipAddressByte1,
ipAddressByte2,
ipAddressByte3,
]).literal('.'),
quantity: Quantity.exactly(3))
.or([
ipAddressByte1,
ipAddressByte2,
ipAddressByte3,
ipAddressSuffix,
]).literal(']');
return FluentRegex()
.or([name, quotedName])
.literal('@')
.or([domainName, domainAddress]);
}