import { RegExpUtility } from "./RegExpUtitlity"; export class ExtendedRegex { private static _extensions:Map = null; static create( regex:string|RegExp, flags:string = undefined ) { if ( typeof regex === "string" ) { let rgx = new RegExp( ExtendedRegex.parseSource( regex ), flags ); return rgx; } else { let source = regex.source; let parsed = ExtendedRegex.parseSource( source ); flags = flags || regex.flags; let rgx = new RegExp( parsed, flags ); return rgx; } } static get extensions() { if ( ExtendedRegex._extensions ) { return ExtendedRegex._extensions; } let extensions:any = {}; // \P = Property, word with hyphen extensions[ "\\\\P" ] = "(?:\\w|\\-)+"; // \V = CSS Attribute Value extensions[ "\\\\V" ] = "(?:\\w|\-|\\||^|$|~|=|#|\\*|\\.|\\\"|\\\'|\\[|\\]|\\s)+"; // \a = Vowels en extensions[ "\\\\a" ] = "[aeiouAEIOU]"; // \A = Not Vowels en extensions[ "\\\\A" ] = "[^aeiouAEIOU]"; // \y = Vowels en with y extensions[ "\\\\y" ] = "[aeiouyAEIOUY]"; // \Y = Not Vowels en with y extensions[ "\\\\Y" ] = "[^aeiouyAEIOUY]"; // \ä = Vowels de extended extensions[ "\\\\ä" ] = "[aeiouyAEIOUYäöüÄÖÜ]"; // \Ä = Not Vowels de extended extensions[ "\\\\Ä" ] = "[^aeiouyAEIOUYäöüÄÖÜ]"; // \k = Consonants extensions[ "\\\\k" ] = "[b-df-hj-np-tv-zB-DF-HJ-NP-TV-Z]"; // \K = Not Consonants extensions[ "\\\\K" ] = "[^b-df-hj-np-tv-zB-DF-HJ-NP-TV-Z]"; // \z = Any Break extensions[ "\\\\z" ] = "(?:.|\n|\r)*?"; // \h = Hex Only lower case extensions[ "\\\\h" ] = "[a-z0-9]"; // \H = Hex extensions[ "\\\\H" ] = "[a-zA-Z0-9]"; ExtendedRegex._extensions = new Map(); for ( let key in extensions ) { let regexSource = RegExpUtility.toRegexSource( key ); let regex = new RegExp( regexSource, "g" ); ExtendedRegex._extensions.set( regex, extensions[ key ] ); } return ExtendedRegex._extensions; } private static parseSource( source:string ) { for ( let entry of ExtendedRegex.extensions ) { let regex = entry[ 0 ]; let replacement = entry[ 1 ]; source = source.replace( regex, replacement ); } return source; } }