JavaScript-正则表达式(个人见解)

定义

正则表达式(英语:Regular Expression,在代码中常简写为regex、regexp或RE)使用单个字符串来描述、匹配一系列符合某个句法规则的字符串搜索模式。

什么是正则表达式?

正则表达式是由一个字符序列形成的搜索模式。

当你在文本中搜索数据时,你可以用搜索模式来描述你要查询的内容。

正则表达式可以是一个简单的字符,或一个更复杂的模式。

正则表达式可用于所有文本搜索和文本替换的操作。

语法

1、显式定义: 一眼就看明白

var 变量名 = new RegExp("正则表达式模式");

// [0-9]:表示匹配数字

var reg = new RegExp("[0-9]");

2、隐式定义: 常用,简单

var 变量名 = /正则表达式模式/;

// \d:表示匹配数字

var reg2 = /\d/;

var reg3 = /[0-9]/;

修饰符

1、修饰符
i:执行对大小写不敏感的匹配
g:执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)
m:多行匹配,即是遇到换行后不停止匹配,直到结束

2、用法
(1)new RegExp(“regexp”,“修饰符”)

(2)/regexp/修饰符

常用

^:以什么开头

$:以什么结尾

{n,m}:至少匹配n次,最多匹配m次

():分组

(reg)\n:引用第n个()里面的分组内容

eg:(\w)\1(\w)\2 :\1、\2表示分别引用第一个()和第二个()里面的分组类容,把匹配到的字符再复用一遍

*:零次或多次匹配前面的字符或子表达式。例如,zo* 匹配"z"和"zoo"。* 等效于 {0,}。

+:一次或多次匹配前面的字符或子表达式。例如,"zo+"与"zo"和"zoo"匹配,但与"z"不匹配。+ 等效于 {1,}。

?:零次或一次匹配前面的字符或子表达式。

选择匹配

选择匹配类似于 JavaScript 的逻辑与运算,使用竖线|描述,表示在两个子模式的匹配结果中任选一个。例如:

  1. 匹配任意数字或字母
var r = /\w+|\d+/;
  1. 可以定义多重选择模式。设计方法:在多个子模式之间加入选择操作符。
var r = /(abc)|(efg)|(123)|(456)/;

重复匹配

在正则表达式语法中,定义了一组重复类量词,如表所示。它们定义了重复匹配字符的确数或约数。
n+:匹配任何包含至少一个 n 的字符串
n* :匹配任何包含零个或多个 n 的字符串
n?:匹配任何包含零个或一个 n 的字符串
n{x}:匹配包含 x 个 n 的序列的字符串
n{x,y}:匹配包含最少 x 个、最多 y 个 n 的序列的字符串
n{x,}:匹配包含至少 x 个 n 的序列的字符串

var s = "ggle gogle google gooogle goooogle gooooogle goooooogle gooooooogle";

//如果仅匹配单词 ggle 和 gogle,可以设计:
var r = /go?gle/g;
var a = s.match(r);
//量词?表示前面字符或子表达式为可有可无,等效于:
var r = /go{0,1}gle/g;
var a = s.match(r);

//如果匹配第 4 个单词 gooogle,可以设计:
var r = /go{3}gle/g;
var a = s.match(r);
//等效于:
var r = /gooogle/g;
var a = s.match(r);

惰性匹配

重复类量词都具有贪婪性,在条件允许的前提下,会匹配尽可能多的字符。
?、{n} 和 {n,m} 重复类具有弱贪婪性,表现为贪婪的有限性。
*、+ 和 {n,} 重复类具有强贪婪性,表现为贪婪的无限性。

越是排在左侧的重复类量词匹配优先级越高。下面示例显示当多个重复类量词同时满足条件时,会在保证右侧重复类量词最低匹配次数基础上,使最左侧的重复类量词尽可能占有所有字符。

var s = "<html><head><title></title></head><body></body></html>";
var r = /(<.*>)(<.*>)/
var a = s.match(r);
//左侧表达式匹配"<html><head><title></title></head><body></body></html>"
console.log(a[1]);
console.log(a[2]);  //右侧表达式匹配“</html>”

与贪婪匹配相反,惰性匹配将遵循另一种算法:在满足条件的前提下,尽可能少的匹配字符。定义惰性匹配的方法:在重复类量词后面添加问号?限制词。贪婪匹配体现了最大化匹配原则,惰性匹配则体现最小化匹配原则。

针对 6 种重复类惰性匹配的简单描述如下:
{n,m}?:尽量匹配 n 次,但是为了满足限定条件也可能最多重复 m 次。
{n}?:尽量匹配 n 次。
{n,}?:尽量匹配 n 次,但是为了满足限定条件也可能匹配任意次。
??:尽量匹配,但是为了满足限定条件也可能最多匹配 1 次,相当于 {0,1}?。
+?:尽量匹配 1 次,但是为了满足限定条件也可能匹配任意次,相当于 {1,}?。
? :尽量不匹配,但是为了满足限定条件也可能匹配任意次,相当于 {0,}?。

反向引用

在字符模式中,后面的字符可以引用前面的子表达式。实现方法如下:

\+ 数字

数字指定了子表达式在字符模式中的顺序。如“\1”引用的是第 1 个子表达式,“\2”引用的是第 2 个子表达式。

var s = "<h1>title<h1><p>text<p>";
var r = /(<\/?\w+>)\1/g;
var a = s.match(r);  //返回数组["<h1>title<h1>","<p>text<p>"]

禁止引用

反向引用会占用一定的系统资源,在较长的正则表达式中,反向引用会降低匹配速度。如果分组仅仅是为了方便操作,可以禁止反向引用。
实现方法:在左括号的后面加上一个问号和冒号。

var s1 = "abc";
var r = /(?:\w*?)|(?:\d*?)/;
var a = r.test(si);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值