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]);
}