JS正则备忘

日期:2014-11-12 10:54 | 标签: 正则表达式 | 阅读:1335

正则表达式,简而言之,就是记录文本规则的代码,学好正则无疑能提升你查找字符串的效率,字符串匹配与替换什么的信手拈来。

匹配url参数

var reg = new RegExp("(^|&)" + name + "=([^&]*)(&|$)", "i");
var r = window.location.search.substr(1).match(reg);
if (r != null) return r[2];

字符串匹配与替换

方法1

var a1 ='[http://www.baidu.com]';
var a2=a1.replace(new RegExp("(^\\[http.+com\\]$)", "g"), "<span>$1</span>");
console.log(a2);

坑:RegExp构造函数的第一个参数为字符串,如果你想进行转义的话,需要加上两个转义符,第一个转义符是对第二个转义符进行转义。
方法2(引自FE-interview)
b为$index,a为匹配的字符串。

// define
(function (window) {
    function fn(str) {
        this.str = str;
    }
    fn.prototype.format = function () {
        var arg = Array.prototype.slice.call(arguments, 0);
        return this.str.replace(/\{\s*(\d+)\s*\}/g, function (a, b) {
            return arg[b] || '';
        });
    };
    window.fn = fn;
})(window);

// use
(function () {
    var t = new fn('<p><a href="{0}">{1}</a><span>{2}</span></p>');
    console.log(t.format('http://www.alibaba.com', 'Alibaba', 'Welcome'));
})();

RegExp.$1

正则表达式中括号的部分的第一个匹配项,,最多是$99 ,使用场景举例:
replace方式

if (/(y+)/.test(fmt))
        fmt = fmt.replace(RegExp.$1, (this.getFullYear() + '').substr(4 - RegExp.$1.length));

exec方式

var reg = /(\d+)-(\w+)/;
var r=reg.exec("111-qwe");
alert(r+" "+RegExp.$1);

颜海镜分享

正则表达式匹配开头为11N, 12N或1NNN,后面是-7-8个数字的电话号码。
我的答案:

/^1[1,2]?N{1,3}-\d{7,8}\b$/

仅去除字符串中的空格

这里列举我想到的几种方法,方法1:

'  aa aa  '.replace(/\w+?(\s+)\w+/g, function (a, b) {debugger;
            return a.replace(/\s/g,'');
        });

方法2:

// 1. 获取第一个非空白字符位置
// 2. 获取最后一个非空白字符位置
// 3. 调用replace

方法3

// 1. 匹配前后空格并替换为其它字符
var ret=str.replace(/(^\s+)|(\s+$)/g,"_");
// 2. 全局替换空格
ret.replace(/\s/g,'');
// 3. 替换回来
ret.replace("_",' ');

三水清分享

var a = new RegExp("123","g");
var b = "abc#123";

console.log(a.test(b));//true
console.log(a.test(b));//false
console.log(a.test(b));//true
console.log(a.test(b));//false

问为什么会输出true,false,true,false?
其实我都猜到答案了,但是这个知识点还真没接触过。 原文链接:一道js正则笔试题

JavaScript正则

  1. compile
    编译正则表达式,一般用于重新计算
  2. exec
    一般用法为
    while((var reg=patt.exec(str))!=null){
     // do your business reg[0]...and so on
    }
    
  3. test
    这个最简单,返回值为true或false

断言

(?:) : 反向引用,如(?:巴拉巴拉)则不会捕获 ( )里内容了
(?=exp) : 匹配exp前面的位置
?<=exp : 匹配exp后面的位置

贪婪与懒惰

有时候我们需要的仅仅是找到为止,比如使用\w+?来匹配aaa,匹配到一个a则会停止搜索。不加?,则匹配项有:a、aa、aaa。贪婪在内容量大时很耗性能,所以没事就加个:?

平衡组与递归

c#有这种情况,js没听说也没用过,见过有人用此技术构建语法树,下次细究下,

参考

入门:http://www.barretlee.com/tools/reg/
进阶:http://www.cnblogs.com/hustskyking/p/how-regular-expressions-work.html

版权声明: 署名-非商业性使用-禁止演绎 4.0 国际(CC BY-NC-ND 4.0
Copyright ©2013-2017 | 粤ICP备14081691号 | yipeng手工打造 | 联系方式