更多内容欢迎来到博客 :https://imjianjian.github.io

正则表达式基础

元字符

正则表达式中有两种字符:

1.元字符.表达式中的特殊字符

字符 含义
t 水平制表符
v 垂直制表符
n 换行符
r 回车符
0 空字符
f 换页符
cX 与X对应的控制字符符(Ctrl+X)
。。。 。。。

2.原意文本字符.普通字符,代表原本的意思

字符类

  • 正则表达式中的字符与待校验字符串中的字符一一对应。
  • 可以用 [ ] 将一些字符归为一类
  • 也可以使用^取反,例如1

范围类

如果在字符类中要将每一种情况都列入晓得太麻烦,对于数字和字母可以使用范围类简写,例如:

  • [0-9]
  • [a-z]
  • [a-zA-Z]

预定义类

正则表达式还提供了一些预定义类,来对复杂范围类进行概括

字符 等价 含义
. 2 除了回车和换行符外的所有字符
d [0-9] 数字字符
D 3 非数字字符
s [tnx0Bfr] 空白符
S 4 非空白符
w [a-zA-Z_0-9] 单词字符(数字,字母,下划线)
W 5 非单词字符

字符边界

字符 含义
^ 以xxx开始
$ 以xxx结束
b 单词边界
B 非单词边界

量词

量词变数所匹配的字符串重复次数

字符 含义
出现零次或一次(最多一次)
+ 出现一次或多次(至少一次)
* 出现零次或多次(任意次)
{n} 出现n次
{n,m} 出现n到m次
{n,} 至少出现n次

贪婪模式与非贪婪模式

贪婪模式

\d{3,6} //尽可能多匹配,但最多为6次

贪婪模式

\d{3,6}? //尽可能少匹配,但至少为3次

分组

使用“()”将匹配规则划分成几个组

//"yes"连续出现3次
(yes){3}

//或:|,可以匹配yes or no或yes and no
yes\b(or|and)\bno

//反向应用
'2017-11-1'.replace(/(\d{4})-(\d{2})-(\d{0,2})/,'$3/$2/$1')
输出:1/11/2017
三个“()”将正则表示时分为三组,每组可以用$n来表示,n即在表达式中出现的次序。该表达式中的三组分别匹配到"2017"、"11"、"1",该函数将匹配到的字符串用第二个参数替换。$3/$2/$1==>2017/11/1

前瞻

前瞻即将匹配到的字符串再向前观察是否也符合所定义的规则,例如校验数字前是否带有“¥”,我们可以使用这个正则表达式:

\d{0,}(?=¥)
名称 规则 含义
正向前瞻 exp(?=assert)
反向前瞻 exp(?!assert)
正向后顾 exp(?<=assert) JavaScript不支持
反向后顾 exp(?<=!assert) JavaScript不支持

RegExp对象

简而言之,正则表达式就是对比校验字符串是否符合某种规则。

RegExp作为JavaScript的内置对象表示JavaScript对正则表达式有着原生的支持。

创建对象

1.使用构造函数
var reg = new RegExp('\\bimjianjian\\b','g');
2.字面量方式
var reg = /\bimjianjian\b/g

以上两种方式都能创建js正则表达式对象,都是校验字符串中是否含有 imjianjian 这个单词,b表示单词边界。且两种方式中都使用了修饰符,构造函数用第二个参数来传入,而字面量则直接写在表达式后。修饰符一共如下三种:

  • g。global全文搜索,不写则只匹配字符串中的第一个
  • i。ignore case,忽略大小写,不写则大小写敏感
  • m。mutiple lines,多行搜索,不写则只搜索第一行

对象属性

  • global:是否全文搜索,默认false
  • ignoreCase:是否大小写敏感,默认false
  • multiline:多行搜索,默认false
  • lastIndex:当前表达式匹配内容的最后一个字符的下一个位置
  • source:正则表达式的文本字符串

对象方法

test(string)

test() 方法检索字符串中的指定值。返回值是 true 或 false。

/\bam\b/.test('i am jianjian') //true
/\bam\b/.test('he is jianjian') //false

exec(string)

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

如果需要找到所有某个字符的所有存在,在找到第一个匹配的字符后,将存储其位置。如果再次运行 exec(),则从存储的位置开始检索,并找到下一个匹配字符,并存储其位置。

var str = "this is jianjian"; 
var reg = new RegExp("is","g");
var result;

while ((result = reg.exec(str)) != null)  {
  console.log(result);
  console.log(reg.lastIndex);
 }

conpile(regexp,modifier)

compile() 既可以改变检索模式,也可以添加或删除第二个参数。即更改匹配规则。

reg=/man/g;
reg2=/(wo)?man/g;
reg.compile(reg2,'i');//将匹配规则改为reg2,且大小写不敏感

string对象中支持使用正则表达式的方法

search(reg)

检索与正则表达式相匹配的值。返回第一个与 regexp 相匹配的子串的起始位置。如果没有找到任何匹配的子串,则返回 -1。search() 方法不执行全局匹配,它将忽略标志 g。它同时忽略 regexp 的 lastIndex 属性,并且总是从字符串的开始进行检索,这意味着它总是返回 stringObject 的第一个匹配的位置。

match(reg|str)

找到一个或多个正则表达式的匹配。返回存放匹配结果的数组。该数组的内容依赖于 regexp 是否具有全局标志 g。

replace(reg,replacement)

  • reg:正则表达式
  • replacement:替换字符

替换与正则表达式匹配的子串。返回一个新的字符串,是用 replacement 替换了 regexp 的第一次匹配或所有匹配之后得到的。

split(reg,howmany)

  • reg:正则表达式
  • howmany:返回数组最大长度

按照匹配到的字符作为切割点。返回切割后的数组。


  1. abc
  2. rn
  3. 0-9
  4. tnx0Bfr
  5. a-zA-Z_0-9

imjianjian
52 声望1 粉丝