library-ts/browser/text/ExtendedRegex.ts

96 lines
2.4 KiB
TypeScript

import { RegExpUtility } from "./RegExpUtitlity";
export class ExtendedRegex
{
private static _extensions:Map<RegExp,string> = 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<RegExp,string>();
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;
}
}