浅谈JavaScript正则表达式的模式匹配

本文深入探讨JavaScript中的正则表达式模式匹配,包括正则表达式的定义、直接量字符、字符类、重复、选择与分组引用、指定匹配位置、修饰符等核心概念。同时介绍了String对象的search(), replace(), match()和split()方法在模式匹配中的应用,以及RegExp对象的属性和方法。" 124625845,10690861,链接法实现散列表与冲突解决,"['数据结构', '哈希算法', 'C++编程']

正则表达式的模式匹配

正则表达式是一个描述字符模式的对象

正则表达式的定义

  • 使用正则表达式字面量定义(脚本加载后,会被编译,不变时,性能更好)

    • var pattern = /s$/;
  • 调用RegExp对象的构造函数定义(在脚本运行过程中,会被编译)

    • var pattern = new RegExp(“s$”);
直接量字符
  • 正则表达式所有字母和数字都是按照字面含义进行匹配的
  • JavaScript正则表达式语法也支持非字母的字符匹配,这些字符需要通过反斜线(\)作为前缀进行转义

正则表达式直接量的每次计算都会创建一个新的RegExp对象,每个新的对象都有自己的lastIndex属性

正则表达式中的直接量字符

字符匹配
字母和数字字符自身
\oNUL字符(\u0000)
\t制表符(\u0009)
\n换行符(\u000A)
\v垂直制表符(\u000B)
\f换页符(\u000C)
\r回车符(\u000D)
\xnn由十六进制数nn指定的拉丁字符,例如,\x0A等价于\n
\uxxxx由十六进制数xxxx指定的Unicode字符,例如,\u0009等价于\t
\cx控制字符^X,例如,\cJ等价于换行符\n
字符类

将直接量字符单独放进方括号内就组成了字符类

  • 一个字符类可以匹配它所包含的任意字符

  • 字符类可以使用连字符来表示字符范围 例如,要匹配拉丁字母表中的小写字母 /[a-z]/

正则表达式中的字符类

字符匹配
[…]方括号内的任意字符
[^…]不在方括号内的任意字符
.除换行符和其他Unicode行终止符之外的任意字符
\w任何ASCII字符组成的单词等价于 [a-zA-Z0-9]
\W任何不是ASCII字符组成的单词等价于 [^a-zA-Z0-9]
\s任何Unicode空白符
\S任何非Unicode空白符
\d任何ASCII数字等价于 [0-9]
\D除了ASCII数字之外的任何字符,等价于 [^0-9]
[\b]退格直接量(特例)
重复

贪婪的 非贪婪后面加+

正则表达式的重复字符语法

字符含义特殊
{n , m}匹配前一项至少n次,但不能超过m次
{n , }匹配前一项n次或者更多次
{n}匹配前一项n次
匹配前一项0次或者1次,等价于 {0 , 1}可能与其匹配0个字符串
+匹配前一项1次或者多次,等价于 {1, }
*匹配前一项0次或者多次,等价于 {0, }可能与其匹配0个字符串
选择,分组的引用

正则表达式的选择,分组的引用字符

字符含义
选择,匹配的是该字符串左边的子表达式或右边的子表达式(从左到右)
(…)组合,将几个项组合为一个单元,这个单元可通过“*” “+” “?”和 “”等符号加以修饰,而且可以记住和这个组合相匹配的字符串以供此后的引用引用
(?:…)只组合,把项组合到一个单元,但不记忆和这个组合相匹配的字符串/([Jj]ava(?:[Ss]cript)?)\sis\s(fun\w*)/在这个正则表达式中\2引用了与(fun\w*)匹配的文本
\n和第n个分组第一次匹配的字符相匹配,组是圆括号中的子表达式(也有可能是嵌套的),组索引是从左到右的左括号数,“(?:”形式的分组不编码/(’")[^’"]*\1/要求左右侧引号相匹配
指定匹配位置

正则表达式中的锚字符

字符含义
^匹配字符串的开头,在多行检索中,匹配一行的开头/^Script$/匹配单词 Script 啥都不可以多
$匹配字符串的结尾,在多行检索中,匹配一行的结尾/^Script$/匹配单词 Script 啥都不可以多
\b匹配一个单词的边界,就是位于字符\w和\W之间的位置(注意!,[\b] 匹配的是退格符)
\B非边界/\B[Ss]cript/与Javascript匹配但不与 script匹配
(?=p)零宽正向先行断言,要求接下来的字符都与p匹配,但不能包括匹配p的那些字符var reg8 = /1cript(?=:)/g;var str = “Script:”;console.log(str.match(reg8))
(?!p)零宽负向先行断言,要求接下来的字符都不与p匹配
修饰符

正则表达式修饰符

字符含义
i执行不区分大小写的匹配
g执行一个全局匹配
m多行匹配模式 ^ $ 代表每行的开头和结尾

用于模式匹配的String方法

search()方法

返回第一个与之匹配的子串的起始位置

特性:

1.不支持全局检索忽略正则表达式参数中的修饰符g

2.如果参数不是正则表达式,则首先会通过RegExp构造函数转换为正则表达式

例: “JavaScript”.search(/script/i); //4

replace()方法

执行检索与替换操作

特性:

1.支持全局检索

2.如果参数不是正则表达式,则直接搜索这个字符串,不会转换

例: str.replace(/javascript/ig, “JavaScript”); //str字符串中所有javascript替换为JavaScript

match()方法

返回一个由匹配结果组成的数组

特性:

1.支持全局检索

2.如果执行的不是全局检索,也返回一个数组,数组的第一个元素是匹配的字符串,余下的元素是正则表达式中用圆括号括起来的子表达式。

例:

“1 wwx 3 qwer rwe 2”.match(/\d+/g); //[“1”, “3”, “2”]

split()方法

将指定字符串拆分成由子串组成的数组

例: “1, 2, 3, 4, 5”.split(/\s*,\s*/); //[“1”, “2”, “3”, “4”, “5”]

RegExp对象

RegExp构造函数有两个参数

var pattern = new RegExp(“s$”, “g”);

RegExp的属性
  • source属性

是一个只读的字符串,包含正则表达式的文本

  • global属性

只读的布尔值,说明该正则表达式是否带有修饰符g

  • ignoreCase属性

只读的布尔值,说明该正则表达式是否带有修饰符i

  • multiline属性

只读的布尔值,说明该正则表达式是否带有修饰符m

  • lastIndex属性

可读可写的整数,如果有修饰符g,这个属性储存在整个字符串中下一次检索开始的位置

会被exec() test()方法 用到

RegExp的方法
  • exec()

  • test()


  1. Ss ↩︎

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值