一个在Flash里面使用的正则表达式的类,使用这个类的原因是FLASH里面对文本输入检测要求不高,例如就不能检测输入的邮件格式是否正确;
class RegExp {
public var const:String = null;
public var source:String = null;
public var global:Boolean = false;
public var ignoreCase:Boolean = false;
public var multiline:Boolean = false;
public var lastIndex:Number = null;
public static var _xrStatic:Number = null;
public var _xr:Number = null;
public static var _xp:Number = null;
public static var _xxa:Array = null;
public static var _xxlp:Number = null;
public var _xq:Number = null;
public var _xqc:Number = null;
public static var d:Number = null;
public static var _xiStatic:Number = null;
public var _xi:Number = 0;
public static var _xxlm:String = null;
public static var _xxlc:String = null;
public static var _xxrc:String = null;
public static var lastMatch:String = null;
public static var leftContext:String = null;
public static var rightContext:String = null;
public static var _xa:Array = new Array();
public static var lastParen:String = null;
public static var _xaStatic:Array = new Array();
public static var $1:String = null;
public static var $2:String = null;
public static var $3:String = null;
public static var $4:String = null;
public static var $5:String = null;
public static var $6:String = null;
public static var $7:String = null;
public static var $8:String = null;
public static var $9:String = null;
private static var _setString:Boolean = RegExp.setStringMethods();
function RegExp() {
if (arguments[0] == null) {
} else {
const = "RegExp";
compile.apply(this, arguments);
}
}
public function invStr(sVal:String):String {
var s = sVal;
var l = length(s);
var j;
var c;
var r = "";
for (var i = 1; i<255; i++) {
c = chr(i);
j = 0;
while (j<=l && substring(s, 1+j++, 1) != c) {
}
if (j>l) {
r += c;
}
}
return s;
}
public function compile() {
this.source = arguments[0];
if (arguments.length>1) {
var flags = (arguments[1]+’’).toLowerCase();
for (var i = 0; i<length(flags); i++) {
if (substring(flags, i+1, 1) == "g") {
this.global = true;
}
if (substring(flags, i+1, 1) == "i") {
this.ignoreCase = true;
}
if (substring(flags, i+1, 1) == "m") {
this.multiline = true;
}
}
}
if (arguments.length < 3) {
var root = true;
RegExp._xrStatic = 1;
//Paren counter
var i = 0;
} else {
var root = false;
this._xr = RegExp._xrStatic++;
var i = arguments[2];
}
this.lastIndex = 0;
/*
Compile the regular expression
The array of character definition objects will be created:
q[n].t --> type of match required: 0 = exact
1 = in char set
2 = not in char set
3 = paren
4 = ref to paren
7 = new "OR" section
9 = beginning of line
10 = end of line
q[n].s --> character or character set
q[n].a --> character has to repeat at least a times
q[n].b --> character has to repeat at most b times
*/
var re = this.source;
var ex;
var l = length(re);
var q = [];
var qc = 0;
var s;
var range = false;
var ca;
var cb;
var atEnd = false;
var char;
for (i=i; i<l; ++i) {
var thischar = substring(re, i+1, 1);
if (thischar == "\\") {
i++;
char = false;
thischar = substring(re, i+1, 1);
} else {
char = true;
}
var nextchar = substring(re, i+2, 1);
q[qc] = new Object();
q[qc].t = 0;
q[qc].a = 0;
q[qc].b = 999;
q[qc].c = -10;
if (char) {
// Handle special characters
if (thischar == "(") {
//Opening paren
ex = new RegExp(re, (this.ignoreCase ? "gi" : "g"), i+1);
i = RegExp._xiStatic;
q[qc].t = 3;
thischar = ex;
nextchar = substring(re, i+2, 1);
} else if (!root && thischar == ")") {
//Closing paren
break;
} else if (thischar == "^") {
//Must be located at the beginning of string/line
if (qc == 0 || q[qc-1].t == 7) {
q[qc].t = 9;
q[qc].a = 1;
q[qc].b = 1;
qc++;
}
continue;
} else if (thischar == "$") {
//Must be located at the end of string/line
if (root) {
atEnd = true;
}
continue;
} else if (thischar == "[") {
//This is a character set
i++;
if (nextchar == "^")