ASP/VBS 正则表达式扩展函数
整理一下这几年做ASP常用的一些功能函数,有时间的话将分批整理.
今天就把有关正则表达式的先整理出来.
废话不多,下面是代码(老规矩,使用时请将E替换成E):
'将普通字符串格式化为一个正则字符串 Function Str2Exp(ByVal tExp) Dim SpeChr SpeChr = Array(92,33,34,36,40,41,42,43,44,45,46,47,58,61,63,91,93,94) For i=0 To Ubound(SpeChr) tExp = Replace(tExp,Chr(SpeChr(i)),Chr(92)&Chr(SpeChr(i))) Next tExp = Replace(tExp,Chr(32),"\s*") tExp = Replace(tExp,Chr(9),"\s*") tExp = Replace(tExp,Chr(13),"\s*") tExp = Replace(tExp,Chr(10),"\s*") tExp = Replace(tExp,Chr(11),"\s*") Str2Exp = tExp End Function '生成一个正则表达式对象 Function REObject( reg, m) Dim re:Set re=new RegExp re.Pattern = reg If InStr(1, m, "g", 1)>0 Then re.Global = True If InStr(1, m, "i", 1)>0 Then re.IgnoreCase = True If InStr(1, m, "m", 1)>0 Then re.MultiLine = True Set REObject=re End Function '正则匹配简便写法 Function RegTest( reg, str) RegTest=RegExpTest(reg,"ig",str) End Function '正则替换简便写法 Function RegReplace( reg, str, rstr) RegReplace=RegExpReplace(reg,"ig",str,rstr) End Function '正则测试字符串 Function RegExpTest( reg, m, str) RegExpTest=REObject(reg, m).test(str) End Function '正则替换字符串 Function RegExpReplace( reg, m, str, rstr) RegExpReplace=REObject(reg, m).Replace(str,rstr) End Function Function RegExecute( reg, str, param) RegExecute=RegExpExecute( reg, "ig", str, param) End Function '//执行正则,返回一个匹配到的数组 Function RegExpExecute( reg, m, str, Param) Dim Match, Matches, Arr, i, Re Set Re = REObject(reg, m) Set Matches=Re.Execute(str) i = 0 If Matches.Count>0 Then ReDim Arr(Matches.Count-1) For Each Match In Matches Arr(i)= Re.Replace(Match.Value, Param) i = i + 1 Next Else ReDim Arr(0) End If RegExpExecute = Arr End Function '//带回调函数执行替换,简便写法 Function RegReplaceCall( reg, str, fstr) RegReplaceCall = RegExpReplaceCall(reg, "ig", str, fstr) End Function '//带回调函数执行替换 Function RegExpReplaceCall( reg, m, str, fstr) Dim Fun, Match, Matches, i, nStr, LastIndex If str & "" = "" Then Exit Function Set Fun = getRef(fstr) Set Matches = REObject(reg,m).Execute(Str) LastIndex = 1 For Each Match In Matches If Match.FirstIndex>0 Then nStr = nStr & Mid(Str, LastIndex, Match.FirstIndex+1-LastIndex) End If nStr = nStr & Fun(Match) LastIndex = Match.FirstIndex+1+Match.Length Next nStr = nStr & Mid(Str, LastIndex) RegExpReplaceCall = nStr End Function '//去除非法字符 Function BadWord(str,rstr) BadWord=RegExpReplace("[\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]+","ig",str,rstr) End Function '替换掉字符串中的所有标签 Function ReplaceTag( str) ReplaceTag=RegExpReplace("<[^>]*>","ig",str,"") End Function '替换多余空格 Function html2txt(str,le) str=Replace(str&""," "," ") html2txt=Left(RegExpReplace("(\s)\s+","ig",ReplaceTag(str),"$1"),le) End Function '邮箱格式匹配 Function TestMail( m) TestMail=False Dim reg:reg="^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$" TestMail=RegExpTest(reg,"ig",m) End Function '判断合法字符 Function IsWord( str) IsWord=RegExpTest("^[\u4e00-\u9fa5\w\d]*$","ig",str) End Function '批量ID匹配 Function TestBat( c) TestBat=False TestBat=RegExpTest("^\s*\d+(?:\s*,\s*\d+\s*)*$","ig",c) End Function '//简化html代码,只保留指定的标签 Function SimpleHTML(content,tags) If tags="" Then tags="p,br" SimpleHTML = RegReplace("<(\/?)("& Replace(tags,",","|") &")([^>]*)>",content&"","[$1$2$3]") SimpleHTML = RegReplace("<[^>]*>",SimpleHTML,"") SimpleHTML = RegReplace("\[(\/?)("& Replace(tags,",","|") &")([^\]]*)\]",SimpleHTML,"<$1$2$3>") End Function '//移除所有html代码 Function RemoveHTML(Content) RemoveHTML = Replace(Content&""," "," ") RemoveHTML = RegReplace("<[^>]*>",RemoveHTML,"") End Function
简单说明:
以上正则体系包含方便的生成正则式的函数,使用正则式检测,替换的函数。
部分函数相同功能分一个简便版本,一个复杂版本,复杂版本是功能的真正实现,简便版本少了一个参数,默认使用正则表达式的全局模式和忽略大小写模式,这种模式是最常用到的。
重点介绍以下几个函数:
REObject: 根据传入的正则字符串和模式字符串生成一个正则对象
RegTest和RegExpTest: 使用正则表达式检测字符串.
RegReplace和RegExpReplace: 使用正则表达式替换匹配到的字符。
RegExecute和RegExpExecute: 使用正则表达式匹配指定的字符串,返回匹配到的数组。这个函数是最开始用于实现js中的正则替换回调函数的功能。
不过用法比较麻烦,而且实现原理上也有漏洞。做法就是将匹配出的字符依次处理后,再根据替换字符一个一个替换回去。
RegReplaceCall和RegExpReplaceCall: 这个是真正实现js中正则替换回调函数功能的函数;但有一点就是函数只能将函数名作为字符串传入,而且要写成全局函数;不可使用系统函数,因为使用了getRef获取函数引用,这种方法不能获取系统函数的引用。回调函数接收一个参数,就是当前的Match对象,它有几种属性和方法可以使用:
Match.FirstIndex:匹配的首字符位置.从0开始(这与VBS中字符索引位置不同)
Match.subMatches(index):获取指定的子匹配,索引从0开始
Match.Length:匹配到的字符串长度;
其它方法可查阅VBS手册;
我用它写了个单词首字母大写的函数实现:
'//过滤拼音中的特殊字符首字母大写 Public Function FilterPinYin( Str) Dim pReg, rMatch, rMth, nStr Str = RegReplaceCall("(^|\s+)(\w)",Trim(Str),"toUCase") Str = RegReplace("[^\w\d\-_]",Str,"-") FilterPinYin = Str End Function Function toUCase(objMatch) toUCase = UCase(objMatch.subMatches(1)) End Function Response.Write FilterPinYin("wo shi yi ge ren") '//输出 '//WoShiYiGeRen