正则表达式

JavaScript RegExp 对象

RegExp 是正则表达式的缩写
当您检索某个文本时,可以使用一种模式来描述要检索的内容。RegExp 就是这种模式
定义 RegExp
new 关键词来定义 RegExp 对象
`var patt1=new RegExp("e");
RegExp 对象的方法
RegExp 对象有 3 个方法:test()、exec() 以及 compile()。
test()
test() 方法检索字符串中的指定值。返回值是 true 或 false。

<script>
    var patt1=new RegExp("e");
    document.write(patt1.test('hello world!!!'))// 输出结果:true
</script>

exec()
exec() 方法检索字符串中的指定值。返回值是被找到的值。如果没有发现匹配,则返回 null。

<script>
    var patt1=new RegExp("e");
    document.write(patt1.exec('hello world exit!!!'))// 输出结果:e
</script>

RegExp第二个参数,"g",匹配全局匹配

        <script>
            var patt1=new RegExp("e","g");
            do{
                var result=patt1.exec('hello world exit!!!');
                document.write(result)
            }while(result!=null)
            //输出结果:eenull
        </script>

compile()
compile() 方法用于改变 RegExp。
compile() 既可以改变检索模式,也可以添加或删除第二个参数。

<script>
            var patt1=new RegExp("e","g");
            document.write(patt1.test('hello world !!! exit'))//输出结果:true
            patt1.compile('a');//改变RegExp,相当于:patt1=new RegExp("a");
            document.write(patt1.test('hello world !!! exit'))//输出结果:false 
        </script>

创建正则表达式

var r = /a/;

正则.test(字符串)

正则去匹配字符串,如果匹配成功就返回真,如果匹配失败就返回假

var str = 'abcdef';
var re = /b/;

alert( re.test(str) );

转义字符

^:匹配开始位置
$:匹配结束位置
\s : 空格 包括 tab 和 换行
\S : 非空格
\d : 数字
\D : 非数字
\w : 字符 ( 字母 ,数字,下划线_ )单个字符 [a-zA-Z_0-9]
\W : 非字符
(大写都是反义)
.:任意单个字符
*:可以匹配任意多次,0-n
+:至少匹配一次,1-n
{min,max}:匹配次数:min-max
? :问号 容许匹配一次,但非必须

[abc] a, b, or c (简单类)
[^abc] 除了a、b或c之外的任意 字符(求反)
[a-zA-Z] a到z或A到Z ,包含(范围)
[a-z-[bc]] a到z,除了b和c : [ad-z](减去)
[a-z-[m-p]] a到z,除了m到 p: [a-lq-z]
pl:判断5-12位的qq号
/^\d{5-12}$/
例子: 判断是否全为数字

var str = '374829348791';

var re = /\D/;

if( re.test(str) ){
    alert('不全是数字');
}
else{
    alert('全是数字');
}

字符串.search(正则)

正则去匹配字符串 , 如果匹配成功,就返回匹配成功的位置,如果匹配失败就返回 -1

var str = 'abcdef';

var re = /b/;

alert( str.search(re) );

正则中的默认 : 是区分大小写的
如果不区分大小写的话,在正则的最后加标识 i

var str = 'abcdef';

var re = /B/i;//ignore 忽略大小写

alert( str.search(re) );

字符串.match(正则)

正则去匹配字符串,如果匹配成功,就返回匹配成功的数组,如果匹配不成功,就返回null

var str = 'haj123sdk54hask33dkhalsd879';

var re = /\d/;

alert( str.match(re) );

正则默认:正则匹配成功就会结束,不会继续匹配
如果想全部查找,就要加标识 g(全局匹配)

var str = 'haj123sdk54hask33dkhalsd879';

var re = /\d/g;//global  全局

alert( str.match(re) );

查找连在一起的数字

var str = 'haj123sdk54hask33dkhalsd879';

var re = /\d\d/g;

alert( str.match(re) );//只会找到12 54 33 87

量词 : 匹配不确定的位置
+ : 至少出现一次,连续的数组是一个值,没有+号的话,每个值是单独的

var str = 'haj123sdk54hask33dkhalsd879';

var re = /\d+/g;

alert( str.match(re) );
//返回结果 ["123", "54", "33", "879"]

字符串.replace(正则,新的字符串)

正则去匹配字符串,匹配成功的字符去替换成新的字符串

var str = 'aaa';
var re = /a+/g;

str = str.replace(re,'b');

alert(str);

例子:关键字过滤

//菲称仁爱礁附近17艘中国船均在菲军监视之下

//| : 或的意思

//replace : 第二个参数:可以是字符串,也可以是一个回调函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Document</title>
</head>
<body>
    <textarea name="" id="before" cols="30" rows="10"></textarea>
    <textarea name="" id="after" cols="30" rows="10"></textarea>
    <button>过滤</button>
<script>
//菲称仁爱礁附近17艘中国船均在菲军监视之下
var before = document.querySelector('#before');
var after = document.querySelector('#after');
var button = document.querySelector('button');

button.onclick = function(){
    var str = before.value;
    var re = /菲称|中国船|监视之下/g;

    str = str.replace(re, function(str){
        var result = '';
         
         for(var i=0;i<str.length;i++){
             result += '*';
         }
        return result;
    });
    after.value = str;

}

</script>
</body>
</html>

匹配子项 : 小括号 () (还有另外一个意思,分组操作)

把正则的整体叫做(母亲)
然后把左边第一个小括号里面的正则,叫做这个第一个子项(母亲的第一个孩子)
第二个小括号就是第二个孩子

var str = '2013-6-7';

var re = /(\d+)(-)/g;

str = str.replace(re,function($0,$1,$2){
    //第一个参数:$0(母亲),第二个参数 : $1(第一个孩子)
    //,第二个参数 : $1(第二个孩子)
    
    //alert( $2 );
    
    return $1 + '.';
    
});

alert( str );   //2013.6.7

字符类

一组相似的元素 [] 中括号的整体代表一个字符

var str = 'abc';

var re = /a[bde]c/;

alert( re.test(str) );

排除 : ^ 如果^写在[]里面的话,就代表排除的意思

var str = 'afc';

var re = /a[^bde]c/;

alert( re.test(str) );
var str = 'abc';

var re = /a[a-z0-9A-Z]c/;

alert( re.test(str) );

例子:过滤标签

替换前<br />
<textarea>
</textarea><br />
替换后<br />
<textarea>
</textarea><br />
<input type="button" value="确定" id="input1" />
<script>
window.onload = function(){
    var aT = document.getElementsByTagName('textarea');
    var oInput = document.getElementById('input1');
    
    //var re = /<\w+>/g;
    
    var re = /<[^>]+>/g;
    
    oInput.onclick = function(){
        
        aT[1].value = aT[0].value.replace(re,'');
        
    };
    
};
</script>

转义字符

.  :  任意字符

\. : 真正的点

\b : 独立的部分 ( 起始,结束,空格 )
\B : 非独立的部分

//var str = 'one two';
var str = 'onetwo';

var re = /one\b/;

alert( re.test(str) );

量词 : {}

{4,7} : 最少出现4次,最多出现7次
{4,} : 最少出现4次
{4} : 正好出现4次

  • : {1,}
    ? : {0,1} : 出现0次或者1次
  • : {0,} : 至少出现0次*/

例子:判断是不是qq号

var re = /^[1-9]\d{4,11}$/;

邮箱:

var re = /^\w+@[a-z0-9]+(\.[a-z]+){1,3}$/;

重复的子项

\1 : 重复的第一个子项
\2 : 重复的第二个子项

var str = 'abca';

var re = /(a)(b)(c)\2/;//表示重复第二个子项,即同:var re= /(a)(b)(c)(b)/;

alert( re.test(str) )

下面写法的区别

var re = /\w\w/;  //c9
var re = /(\w)\1/; //cc 99

例子: 找重复项最多的字符和个数

//将字符串分割成数组
var str = 'assssjdssskssalsssdkjsssdss';
    //将字符串分割成数组
    var arr = str.split('');
    //在用数组的方法排序,然后用join方法还原字符串;
    str = arr.sort().join('');
    // alert(str);

    var value = '';
    var index = 0;

    var re = /(\w)\1+/g;//这里\1是指与上一个字符相同

str.replace(re,function($0,$1){
    
    //alert($0);
    
    if(index<$0.length){
        index = $0.length;
        value = $1;
    }
    
});

alert('最多的字符:'+value+',重复的次数:'+index);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容