Tags

  • AWS (7)
  • Apigee (3)
  • ArchLinux (5)
  • Array (6)
  • Backtracking (6)
  • BinarySearch (6)
  • C++ (19)
  • CI&CD (3)
  • Calculus (2)
  • DesignPattern (43)
  • DisasterRecovery (1)
  • Docker (8)
  • DynamicProgramming (20)
  • FileSystem (11)
  • Frontend (2)
  • FunctionalProgramming (1)
  • GCP (1)
  • Gentoo (6)
  • Git (15)
  • Golang (1)
  • Graph (10)
  • GraphQL (1)
  • Hardware (1)
  • Hash (1)
  • Kafka (1)
  • LinkedList (13)
  • Linux (27)
  • Lodash (2)
  • MacOS (3)
  • Makefile (1)
  • Map (5)
  • MathHistory (1)
  • MySQL (21)
  • Neovim (10)
  • Network (66)
  • Nginx (6)
  • Node.js (33)
  • OpenGL (6)
  • PriorityQueue (1)
  • ProgrammingLanguage (9)
  • Python (10)
  • RealAnalysis (20)
  • Recursion (3)
  • Redis (1)
  • RegularExpression (1)
  • Ruby (19)
  • SQLite (1)
  • Sentry (3)
  • Set (4)
  • Shell (3)
  • SoftwareEngineering (12)
  • Sorting (2)
  • Stack (4)
  • String (2)
  • SystemDesign (13)
  • Terraform (2)
  • Tree (24)
  • Trie (2)
  • TwoPointers (16)
  • TypeScript (3)
  • Ubuntu (4)
  • Home

    A Review of ES6 - Extended Literals, Enhanced Regular Expression

    Published Oct 08, 2019 [  Node.js  ]

    Extended Literals

    Binary & Octal Literal

    Direct support for safe binary and octal literals

    0b111110111 === 503
    0o767 === 503
    

    Unicode String & RegExp Literal

    Extended support using Unicode within strings and regular expressions.

    "𠮷".length === 2
    "𠮷".match(/./u)[0].length === 2
    "𠮷" === "\uD842\uDFB7"
    "𠮷" === "\u{20BB7}"
    "𠮷".codePointAt(0) == 0x20BB7
    for (let codepoint of "𠮷") console.log(codepoint)
    

    Enhanced Regular Expression

    Regular Expression Sticky Matching

    Keep the matching position sticky between matches and this way support efficient parsing of arbitrary long input strings, even with an arbitrary number of distinct regular expression.

    let parser = (input, match) => {
        for (let pos = 0, lastPos = input.length; pos < lastPos; ) {
            for (let i = 0; i < match.length; i++) {
                match[i].pattern.lastIndex = pos
                let found
                if ((found = match[i].pattern.exec(input)) !== null) {
                    match[i].action(found)
                    pos = match[i].pattern.lastIndex
                    break
                }
            }
        }
    }
    
    let report = (match) => {
        console.log(JSON.stringify(match))
    }
    parser("Foo 1 Bar 7 Baz 42", [
        { pattern: /Foo\s+(\d+)/y, action: (match) => report(match) },
        { pattern: /Bar\s+(\d+)/y, action: (match) => report(match) },
        { pattern: /Baz\s+(\d+)/y, action: (match) => report(match) },
        { pattern: /\s*/y,         action: (match) => {}            }
    ])
    

    References: