正则表达式

正则表达式的创建、匹配字符串、转义、字符类、重复以及常用字符

首先是工具推荐:

http://tools.jb51.net/regex/create_reg

http://tools.jb51.net/regex/javascript

 

 

i ignoreCase 忽略大小写

g global 全局

m multiline 多行

 

 

正则匹配

pattern.test(str)

pattern.exec(str)

 

 

修饰符的用法

var pattern = new RegExp('js','i');
var pattern = /js/i;

用户输入获取要匹配的文本

var pattern = '/' + userInput + '/i';
new RegExp(userInput,'i');

转义字符 \

匹配换行符 \n

    var str = '1.html\n2.css\n3.js';
    var pattern = /\n/;
    console.log(str);
    console.log(pattern.exec(str));

话说这个换行符好Q

 

 

匹配空格\t

 

 

十六进制匹配\x开头:

a=\x61

b=\x62

\n=\x0A

    var str = 'a\nb'var pattern = /\x61\x0A\x62/;
    console.log(pattern.exec(str));

unicode表示:

\u0009=\t 空白符

    var str = '    js'var pattern = /\u0009/;
    console.log(pattern.exec(str));

基本汉字unicode范围:\u4e00-\u9fa5

 

 

方括号是单个匹配,表示出现j或者s

    var str = 'sjavascript'var pattern = /[js]/;

^在[]里面代表非

^在[]外面代表是为首

    var str = 'jscript'var pattern = /[^js]/;//不是j或者s
    console.log(pattern.exec(str));

.代表任意字符,但不能匹配\n

    var str = '\n'var pattern = /./;
    console.log(pattern.exec(str));

/[a-zA-Z0-9_]/ /\w/ =数字字母下划线

/[^a-zA-Z0-9_]/ /\W/ =非数字字母下划线

\d 匹配数字

\s 匹配空格

 

 

匹配价格

    var str = '肯德基豪华午餐:¥15.5!'var pattern = /\d{1,}\.{0,1}\d{0,}/;
    console.log(pattern.exec(str));

+ 匹配一次或更多次的重复
+?匹配一次或更多次的重复,但是在能使整个匹配成功的前提下使用最少的重复

贪婪模式

    var str = '<td><p>a</p></td><td><p>b</p></td>'var pattern = /<td>.*<\/td>/;
    console.log(pattern.exec(str));

懒惰模式

    var pattern = /<td>.*?<\/td>/;
    console.log(pattern.exec(str));

正则表达式的() [] {} 有着不同的意思

() 是为了提取匹配字符串的,表达式中有几个()就有几个相应的匹配字符串

(abc)? 表示这一组要么一起出现,要么不出现,出现那则按顺序出现。

(?:abc)表示找到一样abc的一组,但是不记录,不保存到&#x53D8;&#x91CF;&#x4E2D;&#xFF0C;&#x5426;&#x5219;&#x53EF;&#x4EE5;&#x901A;&#x8FC7;" role="presentation" style="overflow-wrap: normal; max-width: none; max-height: none; min-width: 0px; min-height: 0px; float: none;" id="MathJax-Element-1-Frame">变量中,否则可以通过变量中,否则可以通过x取第几个括号所匹配到的项。比如(aaa)(bbb)(ccc)(?:ddd)(eee)可以用1&#x83B7;&#x53D6;(aaa)&#x5339;&#x914D;&#x5230;&#x7684;&#x5185;&#x5BB9;&#xFF0C;&#x800C;" role="presentation" style="overflow-wrap: normal; max-width: none; max-height: none; min-width: 0px; min-height: 0px; float: none;" id="MathJax-Element-2-Frame">1获取(aaa)匹配到的内容,而1获取(aaa)匹配到的内容,而3则获取到了(ccc)匹配到的内容,而$4则获取的是由(eee)。

a(?=bbb)顺序环视 表示a后面必须紧跟3个连续的b

(\s*)表示连续空格的字符串

 

 

[] 是定义匹配的字符范围。比如[a-zA-Z0-9]表示相应位置的字符要匹配英文字符和数字。[\s*表示空格或者*号]

{}一般是用来匹配的长度。比如\s{3}表示匹配三个空格,\s[1,3]表示匹配1到3个空格

(0-9)匹配'0-9'本身。[0-9]*匹配数字(注意后面有*,可以为空)[0-9]+匹配数字(注意后面有+,不可以为空),

{0-9}写法是错误的

[0-9]{0,9}表示长度为0到9的数字字符串。

 

 

\1 = ab

    var str = '<p><a>这是一段文字</a></p>'var pattern = /<([a-zA-Z]+)>(.*?)<\/\1>/;
    console.log(pattern.exec(str));

指定匹配位置

^开始 $结尾

匹配全是数字,方法一:

    var str = '110119120'var pattern = /^\d+$/;
    console.log(pattern.exec(str));
    if (pattern.test(str)) {
        console.log('全是数字!');
    } else {
        console.log('不全是数字!');
    }

匹配全是数字,方法二:

    var str = '11011a9120'var pattern = /\D/ (pattern.test(str)) {
        console.log('不全是数字!' {
        console.log('全是数字!');
    }

\b = 单词边界

    var str = '@@@js@@@'var pattern = /\bjs\b/; @也被识别为单词边界
    console.log(pattern.exec(str));

通过类名获取元素

    function getByClassName(className,parentNode) {
         (document.getElementsByClassName) {
            return document.getElementsByClassName(className);
        }  {
            parentNode = parentNode || document;
            var nodeList = [];
            var allNodes = parentNode.getElementsByTagName('*');
             正则匹配某个类名
            new RegExp('\\b' + className + '\\b');

            for (var i = 0; i < allNodes.length; i++) {
                 (pattern.test(allNodes[i].className)) {
                    nodeList.push(allNodes[i]);
                }
            }
             返回所有匹配到的元素集合
             nodeList;
        }
    }

\b和\s有什么区别

\babc\b匹配的是"abc"
\sabc\s匹配的不是"abc",前后还带空格" abc "
\b只是匹配字符串开头结尾及空格回车等的位置,不会匹配空格符本身

 

 

如果后面紧跟script,则匹配java

    var str = 'javascript'var pattern = /java(?=script)/;
    console.log(pattern.exec(str));

正则表达式 - (?!),(?:),(?=)的区别

(?:pattern) 非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。

(?=pattern) 非获取匹配,正向肯定预查。例如,“Windows(?=95|98|NT|2000)”能匹配“Windows2000”中的“Windows”,但不能匹配“Windows3.1”中的“Windows”。

(?!pattern) 非获取匹配,正向否定预查,例如“Windows(?!95|98|NT|2000)”能匹配“Windows3.1”中的“Windows”,但不能匹配“Windows2000”中的“Windows”。

(?<=pattern) 非获取匹配,反向肯定预查。例如,“(?<=95|98|NT|2000)Windows”能匹配“2000Windows”中的“Windows”,但不能匹配“3.1Windows”中的“Windows”。

(?<!pattern) 非获取匹配,反向否定预查,与正向否定预查类似,只是方向相反。例如“(?<!95|98|NT|2000)Windows”能匹配“3.1Windows”中的“Windows”,但不能匹配“2000Windows”中的“Windows”。

 

 

RegExp对象

RegExp实例方法

    var pattern = /js/new RegExp('js');

获取所有的匹配

    var str = '1.js 2.js 3.js'g;
    var total = 0,match = ''while ((result = pattern.exec(str)) != null) {
        total++;
        match += '第' + total + '个匹配到的是:' + result[0] + ',它的位置是:' + result.index + '\n';
    }
    match += '共找到' + total + '处匹配\n';
    console.log(str);
    console.log(match);

valueOf:返回一个 Number 对象的基本数字值。

toString():把数字转换为字符串,使用指定的基数。

toLocalString():把数字转换为字符串,使用本地数字格式顺序

    new RegExp('a\\nb')
    console.log(pattern.toString());a\nb
    console.log(pattern.toLocaleString());a\nb
    console.log(pattern.valueOf() === pattern); a\nb

RegExp实例属性

ignoreCase:是一个只读的布尔值,看这个正则表达式是否带有修饰符i

multiline:是一个只读的布尔值,看这个正则表达式是否带有修饰符m

source:是一个只读的字符串,包含正则表达式的文本

lastIndex:是一个可读/写的整数,如果匹配模式中带有g修饰符,这个属性存储在整个字符串中下一次检索的开始位置,这个属性会被exec( ) 和 test( ) 方法用到

    var str = 'js js js');
    console.log(pattern.ignoreCase); true
    console.log(pattern.global); true
    console.log(pattern.multiline); false
    console.log(pattern.source); js
    console.log(pattern.exec(str));
    console.log(pattern.lastIndex); 0
3

RegExp构造函数属性列表

exec( )接受一个参数时(即要应用模式的字符串),返回包含第一个匹配项信息的数组

包含两个额外的属性

index:表示匹配文本的第一个字符的位置

input:表示存放的为被检索 的字符串string

lastIndex属性,返回匹配内容的最后一个索引位置,也就是下一个匹配的开始位置,注意字符串索引从0开始

lastMatch($&)属性,只读属性,如果没有匹配信息,则该属性的值为空字符串

lastParen属性 只读静态属性,该属性返回在最近一次匹配检测中所得到的最后一个子匹配的值,如果没有子匹配则返回空字符串

leftContext属性 返回匹配内容左侧的字符信息 该属性的初始值为空字符串 ,如果有相应的匹配该属性的值就会改变

    var pattern = /(j)s/;
    pattern.exec(str);
    console.log(RegExp.input);js js js
    console.log(RegExp.$_);  = input
    console.log(RegExp['$_']);  = input
    console.log(RegExp.lastMatch); js
    console.log(RegExp['$&']);  = lastMatch
    console.log(RegExp.leftContext);
    console.log(RegExp['$`']);  = leftContext
    console.log(RegExp.rightContext);
    console.log(RegExp["$'"]);  = rightContext
    console.log(RegExp.lastParen);
    console.log(RegExp["$+"]);  = lastParen

String对象中与正则表达式相关的方法

search()

    var str = 'html js js'g;
    console.log(str.search(pattern));5

match()

    var str = 'js1\njs2\njs3'var pattern = /^js/mg;
    console.log(str);
    console.log(str.match(pattern));

split()

    var str = 'html,css,js'var pattern = /\s*,\s*/;  包括,左右出现空格也能匹配到
    console.log(str.split(pattern));

replace()

    var str = 'I love js'var pattern = /(js)/;
    document.write(str.replace(pattern,'<strong style="color: red;">$1</strong>'));\

用*屏蔽相关文字

    var str = '中国军队和阿扁一起办证'var pattern = /国军|阿扁|办证/g;
    console.log(str.replace(pattern,'*'));

 

几个文字对应几个*

    function ($0) {
        var result = '';
        var i = 0; i < $0.length; i++) {
            result += '*';
        }
         result;
    }));

常用的正则表达式

1.QQ

         全是数字

         首位不能为0

         最少5位(10000)

         目前最多11位?

    /^[1-9]\d{4,10}$/
    /^[1-9]\d{4,}$/

2.昵称

         中、英文、数字以及下划线

         2-18位

    /^[\u4e00-\u9fa5a-zA-Z0-9_]{2,18}$/
    /^[\u4e00-\u9fa5\w]{2,18}$/

3.密码

         6-16位

         不能用空白字符\s

    /^\S{6,16}$/
    /^[\w~!@#$%^\[\]]{6,16}$/

4.去除字符串首尾的空白字符

    var str = '        Alex         'var pattern = /^\s+|\s+$/
     trim(str) {
        return str.replace(/^\s+/,'').replace(/\s+$/,'');
    }
    ;
    console.log('|' + trim(str) + '|');

5.-转驼峰

    var str = 'background-color'var pattern = /-([a-z])/gi;
    console.log(str.replace(pattern,1)"> (all,letter) {
         letter.toUpperCase();
    }));

函数封装

     toCamelCase(str) {
        return str.replace(pattern, letter.toUpperCase();
        })
    }

6.匹配HTML标签

    var str = '<p class="odd" id="odd">123</p>'var pattern = /<[^>]+>/g; <>中间没有再出现>
    console.log(str.match(pattern));

7.邮箱

                   alex@yahoo.com.cn

                   alex_1@yahoo.com.cn

                   alex_1.a-sdasd.asdasdas.com@yah-o_o.com.adasdsd.cn

    /(?:\w+\.)*\w+@(?:\w+\.)+[a-z]/i
    /^[a-z0-9]+(?:[._-][a-z0-9]+)*@[a-z0-9]+(?:[._-][a-z0-9]+)*\.[a-z]{2,4}$/i

8.URL

         (协议:\/\/)主机名(:端口号)(/路径)

ftp|http|https|mailto|file:///

    /^(https?:\/\/)?([^:\/]+)(:\d+)?(\/.*)?$/

9、匹配主机名

         /[^:\/]+/

         -www.-imos-oc.casfasf.sadasd.com

    /[a-z0-9]|[a-z0-9][-a-z0-9]*[a-z0-9]/i
    /^([a-z0-9]\.|[a-z0-9][-a-z0-9]*[a-z0-9]\.)*(com|edu|gov|net|org|[a-z]{2})$/i
    /^([a-z0-9]\.|[a-z0-9][-a-z0-9]*[a-z0-9]\.)*([a-z]+)$/i

10、匹配所有字符

    /[\w\W]//[\d\D]//[\s\S]//[^]/

11、分别写出匹配正整数、负整数以及既能匹配正整数,也能匹配负整数的正则表达式

提示:1.注意0是整数,不是正整数,也不是负整数

    正整数: /[1-9]\d*/
    负整数: /-[1-9]\d*/
    正整数和负整数:/-?[1-9]\d*/
整数:/0|-?[1-9]\d*/

12、?禁止贪婪模式,请匹配第一个[]以及它里面的内容

    var str = 'js[javascript];html[hyper text markup language];css[cascading style sheet];'var pattern = /\[.*?\]/; 
    console.log(pattern.exec(str));

13、html标签的属性值既可以放在""中,也可以放在''中,例如<p class="box" id='box'></p>

写出既能匹配""中内容,又能够匹配''中内容的正则表达式  

    /(["'])[^"']\1/

14、现有字符串'Windows98,WindowsXP,Windows7',请分别写出匹配后面是XP的Windows和后面不是7的Windows的两个正则表达式

提示:1.前瞻性匹配和负向前瞻性匹配

    /Windows(?=XP)/
    /Windows(?!7)/

15、RegExp对象

匹配字符串'weekend,endfor,end'中所有的end,并分别打印出其中的字母e

提示:1.全局匹配 2.exec循环打印

()包起来的会被存储到结果中

    var str = 'weekend,end'var pattern =/(e)nd/var result;
    while((result = pattern.exec(str)) != ) {
        console.log(result[1]);
    }

String对象与正则表达式相关的方法

16、找出字符串'110报警120急救119火警114查询'中的所有数字,并打印出来

提示:1.全局匹配 2.match

    var str = '110报警120急救119火警114查询'var pattern =/\d+/g;
    console.log(str.match(pattern));

17、找出字符串'asdfgaaaafdgdgaaaadgsxcvcxva'中出现次数最多的字符,并打印出其出现的次数

提示:1.利用数组排序 2.利用引用匹配相同的字符

    var str = 'asdfgaaaafdgdgaaaadgsxcvcxva'var arr = str.split('');  转换成数组
    str = arr.sort().join('');  排序之后再拼成字符串,此时相同的字符紧挨在了一起
    var value = '';  出现次数最多的字符
    var count = 0;  出现次数
    var pattern =/(\w)\1+/g;  匹配紧挨着的相同字符
    str.replace(pattern,1)">function ($0,$1 $0表示匹配到的所有相同字符,$1表示第一个分组匹配的字符,也就是单个字符
        if (count < $0.length) {
         如果$0.length>count,就表示此时匹配到的字符,到目前为止是出现次数最多的
            count = $0.length;
            value = $1;
        }
    });
    console.log('出现次数最多的字符是:'+value+',共出现'+count + '次');

相关文章

kindeditor4.x代码高亮功能默认使用的是prettify插件,prett...
这一篇我将介绍如何让kindeditor4.x整合SyntaxHighlighter代...
js如何实现弹出form提交表单?(图文+视频)
js怎么获取复选框选中的值
js如何实现倒计时跳转页面
如何用js控制图片放大缩小