# 正则表达式

TIP

这部分内容非常重要,如果你能把 正则表达式 完全掌握。工资至少涨 3千

什么是 正则表达式 ,他是描述一个字符串的"规则"。比如手机号码,一般都是 138135150 这样开头,如果是 510 这样开头的数字,那肯定不是电话号码。

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

# 语法

以下两种方法都可以定义一个正则表达式,一般用第二种。

// 第一种:
let patt=new RegExp('石兴龙', 'ig');
// 第二种:
patt=/石兴龙/ig;

实例解析:

/石兴龙/i  是一个正则表达式。
石兴龙  是一个正则表达式主体 (用于检索)。
i  是一个修饰符 (搜索不区分大小写)。

# 快速上手

我们先来看几个具体的案例,好让你感受一下正则表达式的用法

// 判断手机号码 是否合法
/^1[3589]\d{9}$/.test(15021134415) // true
// 其中第一个数字 “1” 就代表 数字 “1”,大部分英文和数组在表达式中就是代指他的本意

// 判断邮箱 是否合法
/^[a-zA-Z0-9]+@[a-zA-Z0-9]+(\.[a-zA-Z0-9]+)+$/.test('1003865572@qq.com'); // true

// 替换字符串内容
let str = `123-A-456-B-7-C-8`
console.log(str.replace(/-\w-/g,'-a-'));
// 输出:123-a-456-a-7-a-8

// 搜索字符串中合法的值
let str = `
    石兴龙
        邮箱:1003865572@qq.com 
    石兴龙2号
        邮箱:15022141541@163.com 
`
console.log(str.match(/[A-Za-z0-9]+@[A-Za-z0-9]+(\.[A-Za-z0-9]+)+/g));
// 输出: ["1003865572@qq.com", "15022141541@163.com"]

通过上面几个例子你可以感受到,正则表达式 他描述的是一个字符串 只能有什么

比如这个表达式

/^1[3589]\d{9}$/

翻译成人话:

/第一位必须是1 第二位数字必须是3或5或8或9 剩下的有9个正整数/ 

接下来,按下心。让我们来全方面的了解一下正则表达式

# 能力越大责任越大

# 属于字符串的方法

在 js 中,正则表达式通常用于这几个个字符串方法 : search() match() 和 replace()。

search() 方法 根据规则查找在字符串中的位置

let str = `石兴龙 javascript 全栈教程是 免费的`
let idx = str.search(/javascript/i);
idx === 4

replace() 方法: 根据规则做字符串替换

let str = `石兴龙 javascript 全栈教程是 免费的`
let txt = str.replace(/石兴龙/i,"石兴龙先生");
txt === '石兴龙先生 javascript 全栈教程是 免费的'

split() 根据某个规则把字符串分割为数组。

let str = `石兴龙-javascript-全栈教程是-免费的`
let strList = str.split(/-/i);
strList = ["石兴龙", "javascript", "全栈教程是", "免费的"]

# 属于 RegExp 的方法

test() 判断某个字符串是否符合 规则

/^1[3589]\d{9}$/.test(15021134415)

exec() 查询某个规则在字符串中的位置。该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。

let str = `石兴龙 javascript 全栈教程是 免费的`
str.replace(/microsoft/i,"Runoob");
// ["a", index: 5, input: "石兴龙 javascript 全栈教程是 免费的", groups: undefined]

# 修饰符

这是在表达式结尾的地方,描述表达式的匹配范围。

修饰符 描述
i 匹配规则时,忽略英文大小写
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。

# 方括号

方括号用于查找某个范围内的字符,一个方括号代某表一位字符。

表达式 描述
[abc] 匹配 a 或 b 或 c
[^abc] 匹配 不是a 或 不是b 或 不是c
[0-9] 查找任何从 0 至 9 的数字。
[a-z] 查找任何从小写 a 到小写 z 的字符。
[A-Z] 查找任何从大写 A 到大写 Z 的字符。
[A-z] 查找任何从大写 A 到小写 z 的字符。
(red blue

# 元字符

元字符(Metacharacter)是拥有特殊含义的字符:

元字符 描述
. 查找单个字符,除了换行和行结束符。
\w 查找单词字符。
\W 查找非单词字符。
\d 查找数字。
\D 查找非数字字符。
\s 查找空白字符。
\S 查找非空白字符。
\b 匹配单词边界。
\B 匹配非单词边界。
\0 查找 NULL 字符。
\n 查找换行符。
\f 查找换页符。
\r 查找回车符。
\t 查找制表符。
\v 查找垂直制表符。
\xxx 查找以八进制数 xxx 规定的字符。
\xdd 查找以十六进制数 dd 规定的字符。
\uxxxx 查找以十六进制数 xxxx 规定的 Unicode 字符。

# 量词

量词 描述
n+ 匹配任何包含至少一个 n 的字符串。例如,/a+/ 匹配 "candy" 中的 "a","caaaaaaandy" 中所有的 "a"。
n* 匹配任何包含零个或多个 n 的字符串。例如,/bo*/ 匹配 "A ghost booooed" 中的 "boooo","A bird warbled" 中的 "b",但是不匹配 "A goat grunted"。
n? 匹配任何包含零个或一个 n 的字符串。例如,/e?le?/ 匹配 "angel" 中的 "el","angle" 中的 "le"。
n{X} 匹配包含 X 个 n 的序列的字符串。例如,/a{2}/ 不匹配 "candy," 中的 "a",但是匹配 "caandy," 中的两个 "a",且匹配 "caaandy." 中的前两个 "a"。
n{X,} X 是一个正整数。前面的模式 n 连续出现至少 X 次时匹配。例如,/a{2,}/ 不匹配 "candy" 中的 "a",但是匹配 "caandy" 和 "caaaaaaandy." 中所有的 "a"。
n{X,Y} X 和 Y 为正整数。前面的模式 n 连续出现至少 X 次,至多 Y 次时匹配。 例如,/a{1,3}/ 不匹配 "cndy",匹配 "candy," 中的 "a","caandy," 中的两个 "a",匹配 "caaaaaaandy" 中的前面三个 "a"。注意,当匹配 "caaaaaaandy" 时,即使原始字符串拥有更多的 "a",匹配项也是 "aaa"。
n$ 匹配任何结尾为 n 的字符串。
^n 匹配任何开头为 n 的字符串。
?=n 匹配任何其后紧接指定字符串 n 的字符串。
?!n 匹配任何其后没有紧接指定字符串 n 的字符串。
上次更新: 7/9/2020, 3:59:04 PM