zoukankan      html  css  js  c++  java
  • 正则表达式

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

    首先是工具推荐:

    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';
    var pattern = new RegExp(userInput, 'i');

    转义字符 

    匹配换行符

        var str = '1.html
    2.css
    3.js';
        var pattern = /
    /;
        console.log(str);
        console.log(pattern.exec(str));

    话说这个换行符好Q


    匹配空格


    十六进制匹配x开头:

    a=x61

    b=x62

    =x0A

        var str = 'a
    b';
        var pattern = /x61x0Ax62/;
        console.log(pattern.exec(str));

    unicode表示:

    u0009= 空白符

        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));

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

        var str = '
    ';
        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 str = '<td><p>a</p></td><td><p>b</p></td>';
        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- none; max-height: none; min- 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- none; max-height: none; min- 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/;
        console.log(pattern.exec(str));
        if (pattern.test(str)) {
            console.log('不全是数字!');
        } else {
            console.log('全是数字!');
        }

     = 单词边界

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

    通过类名获取元素

        function getByClassName(className, parentNode) {
            if (document.getElementsByClassName) {
                return document.getElementsByClassName(className);
            } else {
                parentNode = parentNode || document;
                var nodeList = [];
                var allNodes = parentNode.getElementsByTagName('*');
                // 正则匹配某个类名
                var pattern = new RegExp('\b' + className + '\b');
    
                for (var i = 0; i < allNodes.length; i++) {
                    if (pattern.test(allNodes[i].className)) {
                        nodeList.push(allNodes[i]);
                    }
                }
                // 返回所有匹配到的元素集合
                return nodeList;
            }
        }

    和s有什么区别

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


    如果后面紧跟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/;
        var pattern = new RegExp('js');

    获取所有的匹配

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

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

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

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

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

    RegExp实例属性

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

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

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

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

        var str = 'js js js';
        var pattern = new RegExp('js', 'ig');
        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
        console.log(pattern.exec(str));
        console.log(pattern.lastIndex); //3

    RegExp构造函数属性列表

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

    包含两个额外的属性

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

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

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

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

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

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

        var str = 'js js js';
        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';
        var pattern = /js/g;
        console.log(str.search(pattern));//5

    match()

        var str = 'js1
    js2
    js3';
        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, '*'));

    几个文字对应几个*

        var str = '中国军队和阿扁一起办证';
        var pattern = /国军|阿扁|办证/g;
        console.log(str.replace(pattern, function ($0) {
            var result = '';
            for (var i = 0; i < $0.length; i++) {
                result += '*';
            }
            return 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-u9fa5w]{2,18}$/

    3.密码

             6-16位

             不能用空白字符s

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

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

        var str = '        Alex         ';
        var pattern = /^s+|s+$/g;
        console.log(str.replace(pattern, ''));

    函数封装

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

    5.-转驼峰

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

    函数封装

        function toCamelCase(str) {
            return str.replace(pattern, function (all, letter) {
                return 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、匹配所有字符

        /[wW]//[dD]//[sS]//[^]/

    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,endfor,end';
        var pattern =/(e)nd/g;
        var result;
        while((result = pattern.exec(str)) != null) {
            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, function ($0, $1) {
            // $0表示匹配到的所有相同字符,$1表示第一个分组匹配的字符,也就是单个字符
            if (count < $0.length) {
            // 如果$0.length>count,就表示此时匹配到的字符,到目前为止是出现次数最多的
                count = $0.length;
                value = $1;
            }
        });
        console.log('出现次数最多的字符是:'+value+',共出现'+count + '次');
  • 相关阅读:
    Egg 中使用 Mongoose 以及 Egg 中的 model
    Egg.js 中使用第三方插件以及 Egg.js 插件 egg-mongo-native 操作 mongodb 数据库
    egg定时任务
    jsx中给VUE绑定事件
    【T09】要认识到TCP是一个可靠的,但不是绝对可靠的协议
    PostgreSQL 高级SQL(五) 内建窗口函数
    PostgreSQL 高级SQL(四) 滑动窗口函数
    PostgreSQL 高级SQL(三) 窗口函数
    PostgreSQL 高级SQL(二) filter子句
    PostgreSQL 高级SQL(一)分组集
  • 原文地址:https://www.cnblogs.com/augustuss/p/13512702.html
Copyright © 2011-2022 走看看