正则表达式学习笔记

正则表达式定义了字符串的模式,可以用来搜索、编辑、处理文本。用//包围一个正则表达式

功能

  • 测试字符串内模式(数据验证)
  • 替换文本
  • 基于模式匹配提取子字符串

语法

正则表达式由普通字符以及特殊字符(元字符)组成。

普通字符

包括没有显式指定为元字符的所有可打印、不可打印字符。(包括所有大小写字母、数字、标点符号、其他符号)

  • 不可打印字符:匹配包括换页符\f、换行符\n、回车符\r、空白字符\s、制表符\t等字符。

特殊字符

类似关键字,匹配特殊字符时需要先使用\将其转义。

特殊字符 描述
^ 匹配输入字符串中的开始位置,若放在方括号表达式中使用,表示不接受该方括号表达式中的字符集合
$ 匹配输入字符串的结尾。若设置了RegExp对象的Multiline属性,则也匹配\n\r
() 标记子字符串的开始和结束
* 匹配前面的子表达式0次或多次
+ 匹配前面的子表达式1次或多次 (至少要有一次)
? 匹配前面的子表达式0次或1次(最多1次)
. 匹配除换行符\n之外的所有单字符
[ 标记一个中括号表达式的开始
\ 将下一个字符标记为特殊字符或向后引用或转义符或原义字符
{ 标记限定符表达式的开始
| 指明两项之间的一个选择

限定符

用来指定正则表达式中一个给定组件必须出现多少次才能满足匹配,共6种:

字符 描述
* 匹配前面的子表达式0次或多次,等价于{0,},如/zo*/匹配zzoozoooo
+ 匹配前面的子表达式1次或多次 (至少要有一次),如/zo+/匹配zozoo,不匹配z
? 匹配前面的子表达式0次或1次(最多1次),如/zo?/,只能匹配zzo,不匹配zoooo
{n} n为非负整数。匹配前面的子表达式n次,如o{2}匹配zoobook,不匹配box
{n,} n为非负整数。至少匹配前面的子表达式n次,如o{2,}匹配zooboooook,不匹配box
{n,m} nm为非负整数,且n<=m。最少匹配前面的子表达式n次,且最多匹配前面的子表达式m次,如o{2,4}匹配zooboook,不匹配boxbooooox

限定符出现在范围表达式之后,故应用于整个范围表达式

非贪婪限定符实现

*+限定符都是贪婪的,即会尽可能多的匹配文字。若在其后加上?就会实现非贪婪或最小匹配

如表达式<p>Hello World<p>

  • 使用/<.*>/匹配,则匹配到的内容为整个表达式<p>Hello World<p>
  • 使用/<.*?>/匹配,则只匹配到<p>

定位符

定位符将正则表达式固定到某位置,让其出现在行首行尾或某单词开头、内部、结尾。用来描述字符串或单词的边界。

字符 描述
^ 匹配输入字符串中的开始位置,即匹配一行文本开始处的文本。若放在方括号表达式中使用,表示不接受该方括号表达式中的字符集合
$ 匹配输入字符串的结尾,即匹配一行文本结束处的文本。若设置了RegExp对象的Multiline属性,则也匹配\n\r
\b 匹配一个单词边界,即字与空格间的位置。如/\bCha/匹配单词Chapter开头的三个字符。/ter\b/匹配单词Chapter结尾的三个字符
\B 非单词边界匹配,如/\Bapt/匹配Chapter中间的apt,但不匹配aptitude开头的apt,因为此apt出现在单词的边界

选择

():可以将选择项括起来,但其相关的匹配会被缓存,可以使用?:放在第一个选项消除此缓存的作用
|:分割相邻的选择项。

反向引用

反向引用提供查找文本中两个相同的相邻单词的匹配项的能力。如:

1
2
3
var str = "Is is the cost of of gasoline going up up";
var patt1 = /\b([a-z]+) \1\b/ig;
document.write(str.match(patt1));
  • \b([a-z]+):匹配一个或多个字母
  • \1\b:引用第一个子匹配项,即单词的第二个匹配项正好由第一个子匹配项匹配。
  • 引用单词边界符确保只检测整个单词
  • i:忽略大小写
  • g:指定将该表达式应用到输入字符串能够查找到的尽可能多的匹配

还可以将url分解为其组件,如:

1
2
var str = "http://www.runoob.com:80/html/html-tutorial.html";
var patt1 = /(\w+):\/\/([^/:]+)(:\d*)?([^# ]*)/;
  • (\w+)\w等价于[a-zA-Z0-9_],匹配下划线、所有字母和数字。该表达式表示匹配url的协议部分,即http。
  • :\/\/:即http后的://
  • ([^/:]):匹配非:/后的一个或多个字符,即url地址部分。
  • (:\d*)?\d等价于[0-9],表示匹配所有的数字。该表达式表示匹配以:开头的0个或多个数字,即url端口号部分。?表示该端口号部分只匹配0次或1次
  • ([^# ]*):表示匹配非#空格字符的任何字符序列,即匹配url的指定路径和页信息。

对正则表达式模式两边添加()会将相关匹配存储到一个临时缓冲区中,所捕获到的每个子匹配都按在正则表达式模式中从左到右出现的顺序存储,从1开始,最多存储99个捕获的子表达式。
可以使用非捕获元字符来重写捕获,忽略对相关匹配的保存。

非捕获元

?::消除圆括号相关匹配缓存的副作用
?=:正向预查,在任何开始匹配圆括号内的正则表达式模式的位置来搜索字符串。
?!:负向预查,在任何开始不匹配该正则表达式模式的位置来匹配搜索字符串

运算符优先级

正则表达式相同优先级的从左到右计算,不同优先级的先高后低。

下表表示优先级由高至低:

运算符 描述
\ 转义符
(),(?:),(?=),[] 圆括号和方括号
*,+,?,{n},{n,},{n,m} 限定符
^,$,以开头的\元字符、字符 定位符和序列
替换、或操作

匹配规则

基本模式匹配

模式是正则表达式最基本的元素,是一组描述字符串特征的字符。

^the: 匹配以the开头的字符串。如匹配the book is over there,不匹配get the book

book$: 匹配以book结尾的字符串。如匹配there is a book,不匹配the book is on the table

^book$: 精准匹配book,只匹配字符串book

book: 与任何包含book的字符串匹配。

若需要匹配转义字符,则需要以\开头,如^\t,匹配以制表符开头的字符串。

字符簇

字符簇一组字符的集合。用方括号[]扩起来。如[AaEeIiOoUu]匹配一个元音字符

-连接可表示一个字符的范围。如:

1
2
3
4
[a-z]:所有小写字母
[A-Z]:所有大写字母
[a-zA-Z]:所有字母
[0-9]:所有数字

方括号内使用^表示非。如:

1
2
[^0-9]:除0-9所有字符
[^a-z]:除a-z所有字符

特殊字符.表示出了新行之外的所有字符。

重复出现

使用{}确定重复出现。

1
2
3
4
5
6
{n}:出现n次
{n,}:出现至少n次
{n,m}:至少出现n次但不超过m次
?:相当于{0,1},出现0次或1次
+:{1,},至少出现1次
*:{0,},出现0次或多次

JavaScript正则表达式RegExp对象

RefExp是JavaScript的正则表达式对象。

语法

1
2
3
var patt = new RegExp(pattern,modifiers);

var patt = /pattern/modifiers;
  • patterm:正则表达式模式
  • modifiers:正则表达式修饰符
    • i:不区分大小写
    • g:执行全文搜索

如:

1
2
3
var patt = new RegExp("^[abc]");

var patt = /is/g;

方法

test():搜索字符串指定的值,根据结果返回truefalse

exec():检索字符中指定值。找到返回该值,未找到返回null。

  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!
  • © 2020-2024 Aweso Lynn
  • PV: UV: