JavaScript中常用的正则表达式日常整理(全)
|
最后的实例代码如下:
lt;script type="text/javascript"gt;
function findLinks(str){
var reg = /lt;as(s*w*#63;s*=s*".+#63;")*(s*hrefs*=s*".+#63;")(s*w*#63;s*=s*".+#63;")
*s*gt;[sS]*#63;lt;/agt;/g;
var arr = str.match(reg);
for(var i=0;ilt;arr.length;i++){
//alert(arr[i]);
document.write('link:'+arr[i]+'lt;br /gt;');
}
}
var str = 'lt;pgt;测试链接:lt;a id = "test" href="http://bbs.blueidea.com" title="无敌"gt;经典论坛
lt;/agt;lt;/pgt;lt;a#63; href = "http://www.blueidea.com/"#63; gt;蓝色理想lt;/agt;';
var arr = findLinks(str);
lt;/scriptgt;
会把所有的链接在页面直接显示出来。注意, 本帖遗留问题:如何执行从右到左的匹配。貌似JS或者VBS没有提供这个功能2、JS或者VBS不支持 后行断言。。用什么方法实现这个功能。 匹配链接的文字 代码:lt;a href="#gt;这里要保存lt;/agt;,只保存链接的文本内容,标签信息删掉。 前面写过一个匹配链接的正则: /lt;as(s*w*#63;=".+#63;")*(s*href=".+#63;")(s*w*#63;=".+#63;")*s*gt;[sS]*#63;lt;/agt;/ 不过我们需要捕获的是文字内容,所以需要做一定的修改。第一步就是在所有的括号内都加上#63;:表示不捕获。第二步就是再多加一个括号放在[sS]*#63;两侧,这样就可以捕获到链接的文字内容了。最后正则如下: /lt;as(#63;:s*w*#63;s*=s*".+#63;")*(#63;:s*hrefs*=s*".+#63;")(#63;:s*w*#63;s*=s*".+#63;")*s*gt;([sS]*#63;)lt;/agt;/ 测试代码如下:
lt;script type="text/javascript"gt;
function anchorText(str){
var reg =/lt;as(#63;:s*w*#63;s*=s*".+#63;")*(#63;:s*hrefs*=s*".+#63;")(#63;:s*w*#63;s*=s*".+#63;")*s*gt;
([sS]*#63;)lt;/agt;/;
str = str.replace(reg,'$1');
return str;
}
var str = 'lt;a id = "test" href="http://bbs.blueidea.com" title="无敌"gt;经典论坛lt;/agt;';
document.write(anchorText(str));
lt;/scriptgt;
正则判断标签是否闭合 来源:求助 超难!正则表达式如何判断一个标签是否闭合 例如:lt;img xxx=”xxx” 就是没有闭合的标签; lt;pgt;p的内容,同样也是没闭合的标签。 从简单的正则开始,先匹配起始标签 /lt;[a-z]+/i 再加上若干属性: /lt;[a-z]+(s*w*#63;s*=s*".+#63;")*/i 下面就到关键点了,标签的闭合。标签可能有两种方式闭合,lt;img xxx=”xxx” /gt; 或者是lt;pgt;xxx lt;/pgt;。 (s*/gt;) 匹配img类的结束,即/gt;。 (s*#63;gt;[sS]*#63;lt;/1gt;) 匹配p类标签的结束标签。gt;是其实标签末尾,之后是标签内容若干个任意字符,最后的lt;/1gt;就是结束标签了。 加上一个或就可以解决了,最后的完整正则表达式: 整个正则: /lt;([a-z]+)(s*w*#63;s*=s*".+#63;")*(s*#63;gt;[sS]*#63;lt;/1gt;|s*/gt;)/i 拿这个正则,只要匹配到了就表示闭合,没匹配到则没有闭合。不过没有考虑相同标签嵌套的问题,例如 lt;divgt;aaaaaalt;divgt;testlt;/divgt; 也被判断为合格,可以通过把最后的匹配p类结束标签写成子正则表达式,并且更改为非贪心,然后在匹配结果中检查是否成对。正则如下: /lt;([a-z]+)(s*w*#63;s*=s*".+#63;")*(s*#63;gt;[sS]*#63;(lt;/1gt;)+|s*/gt;)/i 用正则获得指定标签的内容 有如下代码: lt;channelgt; lt;titlegt;蓝色理想lt;/titlegt; lt;/channelgt; lt;itemgt; lt;titlegt;界面设计测试规范lt;/titlegt; lt;/itemgt; lt;itemgt; lt;titlegt;《古典写实美女》漫画教程lt;/titlegt; lt;/itemgt; lt;itemgt; lt;titlegt;安远――消失的光年lt;/titlegt; lt;/itemgt; lt;itemgt; lt;titlegt;asp.net 2.0多语言网站解决方案lt;/titlegt; lt;/itemgt; nbsp;要求匹配item里的title而不匹配channel里的title。 基本正则: /lt;titlegt;[sS]*#63;lt;/titlegt;/gi 首先是title标签,内容为任意字符若干个,然后是title结束标签。这个正则已经能匹配到所有的title标签。 首先,我简单地修改了一下原正则: /lt;titlegt;[^lt;gt;]*#63;lt;/titlegt;/gi, 因为title里面不应该再嵌有其它标签,这个正则同样是匹配所有标题的内容,最后再加上不去匹配channel中的title。整个正则如下: /lt;titlegt;[^lt;gt;]*#63;lt;/titlegt;(#63;!s*lt;/channelgt;)/gi (#63;!s*lt;/channelgt;)表示要匹配字符串的后面不能跟着若干个空格和一个channel的结束标签。 原帖里有很方便的测试工具,这里就不给测试代码了。 正则判断是否为数字与字母的混合 不能小于12位,且必须为字母和数字的混合。 验证字符串包含数字简单,验证字符串包含字母也简单,验证字符串不包含其它字符也简单,可以用这三个正则分别检查一次字符串,逻辑运算出最终结果。 但是怎么能把这些功能写进一个正则表达式里呢?这个问题真有点伤脑筋。 下面是lexrus的正则: /^([a-z]+(#63;=[0-9])|[0-9]+(#63;=[a-z]))[a-z0-9]+$/ig 思路非常的清晰啊: [a-z]+(#63;=[0-9]) 字母开头,后面必须紧跟着数字。 [0-9]+(#63;=[a-z] 数字开头,后面必须紧跟着字母。 [a-z0-9]+ 后面的字符只要是数字或者字母就可以了。经过测试,发现不好使,123dd会被识别为不合法,dd123则为合法,可见“数字开头,紧跟字母”的正则没有起作用。测试代码如下:
lt;script type="text/javascript"gt;
function istrue(str){
var reg=/^([a-z]+(#63;=[0-9])|[0-9]+(#63;=[a-z]))[a-z0-9]+$/ig;
return reg.test(str);
}
var str#63; = 'AaBc';
var str2 = 'aaa123';
var str3 = '123dd';
var str4 = '1230923403982';
document.write(istrue(str)+'lt;br /gt;');
document.write(istrue(str2)+'lt;br /gt;');
document.write(istrue(str3)+'lt;br /gt;');
document.write(istrue(str4)+'lt;br /gt;');
lt;/scriptgt;
结果为: false,true,false,false 结果中的第三个,将'123dd'判断为非法是错误的。刚开始以为是g的问题,去掉了还是不好使。应该是浏览器bug,我认为lexrus的正则是正确的,可能是浏览器无法处理或”|”的两边都包含正向预查(#63;=)。 修改之后的正则如下: /^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i 意思和上面差不多,但是没有使用正向预查,测试代码如下:
lt;script type="text/javascript"gt;
function istrue(str){
var reg=/^(([a-z]+[0-9]+)|([0-9]+[a-z]+))[a-z0-9]*$/i;
return reg.test(str);
}
var str#63; = 'AaBc';
var str2 = 'aaa123';
var str3 = '123dd';
var str4 = '1230923403982';
document.write(istrue(str)+'lt;br /gt;');
document.write(istrue(str2)+'lt;br /gt;');
document.write(istrue(str3)+'lt;br /gt;');
document.write(istrue(str4)+'lt;br /gt;');
lt;/scriptgt;
nbsp;结果为 false,true,true,false 正确。 空格与英文同时存在 来源:正则问题请指教啊! 匹配英文以及空格,要求必须既有英文字母又有空格。 这个思路和上面的差不多,只要把数字改成空格就可以了。正则如下: /^(([a-z]+s+)|(s+[a-z]+))[a-zs]*$/i 英文开头加空格,或者是空格开头加英文,后面可以是英文或者空格。测试代码如下:
lt;script type="text/javascript"gt;
function istrue(str){
var reg=/^(([a-z]+s+)|(s+[a-z]+))[a-zs]*$/i;
return reg.test(str);
}
var str#63; = 'asdf';
var str2 = 'sadf sdf';
var str3 = 'asdf ';
document.write(istrue(str)+'lt;br /gt;');
document.write(istrue(str2)+'lt;br /gt;');
document.write(istrue(str3)+'lt;br /gt;');
lt;/scriptgt;
利用这个思路也可以实现英文空格英文,英文单词多于两个的匹配。同样,也可以把英文字母换成单词字符w。 显示或者保存正则表达式匹配的部分内容 13588888333 要求,要求只匹配135开头的电话,但是匹配结果只保留135后面的数字。 由于JavaScript里的正则不支持(#63;=xx)xxx的模式,只支持xxx(#63;=xx)的模式。所以只能将135后面的内容作为一个子正则表达式匹配的内容,然后再在后面引用。 Carl给出的函数如下:
function f(phoneNumber) {
var pattern = /^(135)(d{8})$/;
if(pattern.test(phoneNumber))
return phoneNumber.replace(pattern,"$2");
else
return "不是135打头的手机号码!";
}
/^(135)(d{8})$/ 正则中,135作为开头表示第一个子正则表达式,第二个括号内的子正则表达式则匹配后面的8个数字,然后在replace中使用$2就可以引用这个子正则表达式匹配的内容了。测试代码如下:
lt;script type="text/javascript"gt;
function f(phoneNumber) {
var pattern = /^(135)(d{8})$/;
if(pattern.test(phoneNumber))
return phoneNumber.replace(pattern,"$2");
else
return "不是135打头的手机号码!";
}
var arr = new Array(
"13588888333",
"13658447322",
"13558885354",
"13587774654",
"13854554786"
);
for(var i = 0; i lt; arr.length; i++)
document.write(f(arr[i])+'lt;br /gt;');
lt;/scriptgt;
正则表达式替换变量 来源:求教正则 有一个数组: var _A = ['A','B','C','D']; 有一个有“变量”的字符串。 var _B = 'lt;ulgt;lt;ligt;$0$lt;/ligt;lt;ligt;$1$lt;/ligt;lt;ligt;$2$lt;/ligt;lt;ligt;$3$lt;/ligt;lt;/ulgt;'; 说是变量,其实只是字符串中的特殊字符,例如$0$,就称这个为伪变量吧。 最后的要求就是使用正则获得下面这样一个字符串: _C = 'lt;ulgt;lt;ligt;Alt;/ligt;lt;ligt;Blt;/ligt;lt;ligt;Clt;/ligt;lt;ligt;Dlt;/ligt;lt;/ulgt;'; (编辑:PHP编程网 - 湛江站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

