正则表达式基本用法

正则表达式(Regular Expression)是一种匹配模式,描述的是一串文本的特征。他可以实现一些可变字符的替换。

作为一个程序员来说,正则表达式如此的”强大”。同时也是那么的复杂,在此之前都没有好好的看一下正则表达的用法,遇到需要使用正则表达式的时候就去网上找或者直接换做用其他方式实现。这两天好好的把正则表达式的基本使用方式看了一下,所以总结一下正则表达式的基本使用。

一、概念

正则表达式 = 元字符 + 文本字符

元字符可以是字符(例如”?”),也可以是一个字符序列(”\w”)。后面将会一一介绍。

文本字符自然就是我们普通的字符串啦。

javascript中有两种形式来定义正则表达式:

1、构造函数

1
var reg=new RegExp('^[1-9]\\d*$','g');

2、直接量语法

1
var reg=/^[1-9]\d*$/g;

不管用哪种方式,我们发现后面都跟了个g,是什么意思呢?

修饰符(attributes) 含义
i 忽略大小写,默认是大小写敏感的
g 全局搜索(也就是找到所有符合的结果后才停止)
m 多行匹配

二、范围

用来匹配一个区间。

[a-z]
匹配小写字母。[]是可以用连写的方式的,比如匹配所有大小写字母[a-zA-Z]

[^a-z]
所以这就表示非小写字母

三、常见元字符

字符 含义
. 查找单个字符,除开换行和行结束符
^ 匹配以xx开头的字符串(例如^n,匹配以n开头的字符串)
$ 匹配以xx结尾的字符串(n$)
\b 匹配单词的边界(开始或结束)
\B 匹配非单词的边界
\w 查找单词字符(字母、数字、下划线或汉字)等价范围[a-zA-Z0-9_]
\W 查找非单词字符(和\w相反,大写是取反,后面的类似)
\s 查找任意的空白字符 等价范围[ \r\n\f\t\v]
\S 查找非空白字符
\d 查找数字 等价范围[0-9]
\D 查找非数字
\n 查找换行符
\0 匹配空字符

举例:

1、\b[A-Z]\w*\b 匹配所有大写字母开头的单词,\b表示单词开始,然后是一个大写字母[A-Z],然后是任意数量的字母或数字\w*,最后是结束单词\b

2、^[A-Z].*$ 匹配一句话是否以大写字母开头,^[A-Z]表示以大写字母开头,.*表示任意字符,这里结束符$有无都无所谓.

注意区分\b 和 ^ $的区别

1
2
3
4
5
var str="My name is XHAY.";
var patt1=/\b[A-Z]\w*\b/g;
var patt2=/^[A-Z].*$/g;
console.log(str.match(patt1)); //My,XHAY
console.log(str.match(patt2)); //My name is XHAY.

上面例子当中注意结果的区分,\b表示单词开始和结束,所以匹配出了多个单词。^ $表示这一行的开始和结束,所以匹配出来的是一整行话。

四、重复

表示一个元素匹配次数

字符 含义
* 匹配0次或者多次(例如n*,匹配包含0个或多个n的字符串)
+ 匹配至少一次 (n+)
? 匹配0次或者一次 (n?)
{n} 匹配重复n次 (x{n})
{n,} 匹配至少重复n次
{n,m} 匹配重复n到m次

举例:

[1-9][0-9]{4,} 匹配腾讯QQ号码,其规则是以1-9的数字开头的至少4为数字号码

五、分支结构和分组

正则表达式中用”|”来表示两个表达式之间的”或”关系。

用括号来把一些表达式放在一起。

分支结构通常和分组结合起来使用

举例:
1、例如我们的电话号码有两种:三位区号+八位本地号,四位区号+7未本地号;区号都已0开头。正则表达式可书写为:0\d{2}-\d{8}|0\d{3}-\d{7}。所以像023-58508222这一类的都是能够匹配的。

2、(na|i)\w* 表示查找na或i开头的单词,设想一下如果没有这个括号的结果。

1
2
3
4
5
var str="My name is XHAY.";
var patt1=/\b(na|i)\w*\b/g;
var patt2=/\bna|i\w*\b/g;
console.log(str.match(patt1)); //name,is
console.log(str.match(patt2)); //na,is

没有括号na|i\w*的这个正则表达式的意思为:包含na或者包含i的字符。

六、贪婪与懒惰

贪婪匹配:匹配尽可能多的字符。例如a.*b去匹配aabab的结果为aabab.

懒惰匹配:匹配尽可能少的字符。例如a.*?b去匹配aabab的结果为aab,ab.

本教程到此结束,旨在让大家看懂基本的正则表达式。正则表达式还有很多知识需要学习,比如像断言、递归等,可以参考后面的资料。

七、经典例子

有字符串var str=’abc345efgabcab’,请写出3条JS语句分别实现如下3个功能

(1)去掉字符串中的a、b、c字符,形成结果:’345efg’

(2)将字符串中的数字用中括号括起来,形成结果:’abc[3][4][5]efgabcab’

(3)将字符串中的每个数字的值分别乘以2,形成结果:’abc6810efgabcab’

1
2
3
4
5
6
7
8
9
10
11
var str = "abc345efgabcab";
str = str.replace(/\[abc\]/g,""); //'345efg'
str = str.replace(/(\d)/g, "\[$1\]"); //'abc[3][4][5]efgabcab'
str = str.replace(/\d/g, function(a){ //'abc6810efgabcab'
return 2 * a
});

参考资料:

JavaScript RegExp 对象: http://www.w3school.com.cn/jsref/jsref_obj_regexp.asp
正则表达式30分钟入门教程: http://deerchao.net/tutorials/regex/regex.htm
在线正则表达式测试: http://tool.oschina.net/regex#
今天老大分享正则,给了一个分析正则表达式的工具:https://regexper.com/