正则表达式

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

首先是工具推荐:

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 + '次');
原文地址:https://www.cnblogs.com/augustuss/p/13512702.html