胖在一方

出得厅堂入得厨房的胖子

导航

Javascript(十六) Regexp 二

Posted on 2008-04-09 09:46  胖在一方  阅读(704)  评论(0)    收藏  举报
分组
    分组是通过一系列括号包括一系列字符,字符类以及量词来使用的。例如想匹配字符串"dogdog" 可以使用分组 /(dog){2}/ 来表示。
var re=/([bd]ad?)*/;//可以匹配 ba,da bda,bad,dad,bdad

使用反向引用 
    每个引用都被存放在一个特殊的地方以备将来使用,这些存储在分组中的特殊值,被成为反向引用。 
    反向引用是按照从左到右遇到的左括号的顺序来进行创建和编号的,
    例如表达式(A?(B?(C?)))将产生1-3的 三个反向引用。 
    1.(A?(B?(C?))); 
    2.(B?(C?)); 
    3.(C?)

    反向引用可以有几种不同的使用方法。 首先使用正则表达式对象的test(),match()或search()方法后,反向引用的值可以从RegExp构造函数中获得。
    var re=/#(\d+)/;
    
var str="#123456"
;
    re.test(str);
    alert(RegExp.$
1); //output 123456

    还可以直接在定义分组表达式中包含反向引用,这可以通过使用特殊转义序列\1,\2等等来实现
var sToMatch = "dogdog";
var reDogDog = /(dog)\1/
;
alert(reDogDog.test(sToMatch));  
//output true 

    反向引用可以使用在String类的replace()方法中,这通过使用特殊字符序列$1,$2等等来实现。 描述这种功能的最佳例子是在调换字符串中的两个单词的顺序。 将1234 5678 变成 5678 1234可以如此实现
var sToMatch = "1234 5678";
var reMatch = /(\d{4}) (\d{4})/
;
var sNew =sToMatch.replace(reMatch,"$2 $1"
);
alert(sNew);  
//5678 1234

候选 
    候选操作符和ECMAScript的二进制异或一样,是一个管道符(|),它放在两个单据的模式之间。
var sToMatch1 = "blue";
var sToMatch2 = "red"
;
var sToMatch3 = "black"
;
var re = /blue|red|black/
;
                
alert(re.test(sToMatch1));  
//output "true"

alert(re.test(sToMatch2));    //output "true"
alert(re.test(sToMatch3));    //output "true"

    OR模式在实践中一种通常的用法是从用户输入中删除不合适的词。通过针对这些敏感单词使用OR 模式和replace方法,则可以很方便的在帖子发布之前去掉敏感内容。
var reBadWord = /badword|anotherbadword/gi;
var sUserInput = "this is a string using badword and badword1 and anotherbadword"
;
var finalText = sUserInput.replace(reBadWord,"****"
);
alert(finalText);  
//this is a string using **** and ****1 and ****

                
var finalText1 = sUserInput.replace(reBadWord,function
 (sMatch)
                                                                {
                                                                    
return sMatch.replace(/./g,"*"
);
                                                                }
                                                );
            
//可以将每个字符都替换成*

alert(finalText1);//this is a string using ******* and *******1 and **************

非捕获性分组 
    创建反向引用的分组,我们称之为捕获性分组。同时还有一个非捕获性分组,它不会创建反向引用。 如果要创建一个非捕获性分组,则要在左括号后面加上一个问号和一个冒号 ?:
var sToMatch = "#123456789";
var reNumber = /#(?:\d+)/
;
reNumber.test(sToMatch);
alert(RegExp.$
1); //output ""

例如去除所有的HTML标记
    //匹配html标记 <b>abcd</b> 提出去abcd 
    var sHTML = "<a href=\"abcd\">a b c d</a>";
    
var regHTML = /<(.|\s)*?>/ig;

    var sResult = sHTML.replace(regHTML,"");
    alert(sResult); //output "a b c d"