96 lines
2.4 KiB
TypeScript
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;
|
||
|
}
|
||
|
}
|