目录
  1. 1. 正则
  2. 2. 创建
  3. 3. 基础
    1. 3.1. 表达式
    2. 3.2. 元字符
    3. 3.3. 量词
  4. 4. 常用函数
    1. 4.1. String.search()
    2. 4.2. String.replace()
    3. 4.3. String.split()
    4. 4.4. String.match()
    5. 4.5. RegExp.test()
    6. 4.6. RegExp.exec()
  5. 5. 常用正则表达式
JS 中怎么用正则表达式 - 前端随笔

正则

正则表达式(英语:Regular Expression,常简写为regex、regexp或RE),是用于匹配字符串中字符组合的模式。这些模式被用于 RegExp 的 exectest 方法, 以及 String 的 matchmatchAllreplacesearchsplit 方法。正则表达式通常被用来检索、替换那些符合某个模式的文本。


创建

使用正则表达式字面量创建:

1
var re = /ab+c/ig;

调用RegExp对象的构造函数:

1
var re = new RegExp("ab+c","ig");

修饰符:

修饰符 描述
i 忽略大小写
g 全局匹配
m 多行匹配

基础

表达式

表达式 描述
[abc] 查找方括号之间的任何字符。
[^abc] 查找任何不在方括号之间的字符。
[0-9] 查找任何从 0 至 9 的数字。
[a-z] 查找任何从小写 a 到小写 z 的字符。
[A-Z] 查找任何从大写 A 到大写 Z 的字符。
[A-z] 查找任何从大写 A 到小写 z 的字符。
(red|blue|green) 查找任何以 | 分隔的选项。

元字符

元字符 描述
. 查找单个字符,除了换行和行结束符。
\w [0-9a-zA-Z_],字符数字下划线,\W则相反。
\d [0-9],数字,\D则是非数字。
\s 查找空白字符。\S非空字符。
\b 匹配单词边界。\B非单词边界。
\n 换行符。
\r 回车符。
\t 制表符。
\f 换页符。
\r 回车符。
\xxx 八进制数 xxx 规定的字符。\101 = ‘A’
\xdd 以十六进制数 dd 规定的字符。\x41 = ‘A’
\uxxxx 十六进制数 xxxx 规定的 Unicode 字符。/\u0041/ = ‘A’,/\u4f60/ = ‘你’

量词

量词 描述
{n} 包含n个
{n,} 至少n个
{n,m} 至少n个,最多m个
+ {1,} 至少一个
* {0,} 零个或多个
? {0,1} 零个或一个
^s 任何开头为 s 的字符串
s$ 任何结尾为 s 的字符串
?=s 任何其后紧接指定字符串 s 的字符串
?!s 任何其后没有紧接指定字符串 n 的字符串

常用函数

  • String.search(): 检索索引 => index
  • String.replace(): 替换 => String
  • String.split(): 分割 => Array
  • String.match(): 检索返回内容 => Array
  • RegExp.test(): 检索是否存在 => Boolean
  • RegExp.exec(): 检索返回内容 => Array(伪数组,包含索引等信息)

检索与正则表达式相匹配的索引值。(检索不到返回-1)

1
2
var str = 'Hello World!!';
console.log(str.search(/world/i)); //=> 6

String.replace()

替换与正则表达式匹配的字符串。(检索不到返回原字符串)

1
2
3
var str = 'Hello World!!';
var res = str.replace(/world/i, 'Vincent');
// => res = 'Hello Vincent!!'

String.split()

把字符串分割为字符串数组。(检索不到返回包含原字符串的数组)

1
2
3
var str = '1a2b3c4';
var res = str.split(/[A-z]/);
// => res = ['1','2','3','4']

String.match()

返回符合条件的内容数组。
检索不到返回 null

1
2
3
4
5
6
7
var str = '1a2b3c4d5e6f7';
var res = str.match(/[A-z]/g);
// => res = ['a','b','c','d']

var res = str.match(/[A-z]/);
// => ['a'] 非全局模式只返回第一个;
// 伪数组 ["a", index: 1, input: "1a2b3c4d5e6f7", groups: undefined]

RegExp.test()

正则的一个方法,检测一个字符串是否匹配。
返回 true/false

1
2
3
4
var re = /world/;
re.test("Hello world!!"); // => true
// Or
/world/.test('hello world!!'); // => true

RegExp.exec()

正则的一个方法,检索字符串中的正则表达式的匹配。
返回一个伪数组,包含匹配内容、索引、输入;
匹配不到返回 null

1
2
3
4
/\d+/.exec("qq123456");

// => 伪数组
// ["123456", index: 2, input: "qq123456", groups: undefined]

exec()捕获问题:

1
2
3
4
5
6
var str = "duffy2016peixun2017";
var reg = /\d+/; // 非全局模式
console.log(reg.lastIndex);//->0 捕获的时候是从字符串开始的位置进行查找的
console.log(reg.exec(str));//->["2016"...]
console.log(reg.lastIndex);//->0 第二次捕获的话还是从字符串索引为零的位置开始查找
console.log(reg.exec(str));//->["2016"...]
1
2
3
4
5
6
var str = "duffy2016peixun2017";
var reg = /\d+/g; // 全局模式
console.log(reg.lastIndex);//->0 捕获的时候是从字符串开始的位置进行查找的
console.log(reg.exec(str));//->["2016"...]
console.log(reg.lastIndex);//->9 第二次捕获的话还是从字符串索引为零的位置开始查找
console.log(reg.exec(str));//->["2017"...]

常用正则表达式

正则测试工具网站:RegExr

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
字符串类:
中文字符: [u4e00-u9fa5]
中文、英文、数字包括下划线: ^[\u4E00-\u9FA5A-Za-z0-9_]+$
Email地址: ^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$
手机号: ^([1][3,4,5,6,7,8,9])\d{9}$)
QQ号: ^[1-9][0-9]{4,}$
用户名是否合法(字母开头,允许字母数字下划线,5-16位): ^[a-zA-Z][a-zA-Z0-9_]{4,15}$

数字类:
只能输入数字:^[0-9]*$
只能输入n位的数字:^d{n}$
只能输入至少n位数字:^d{n,}$
只能输入m-n位的数字:^d{m,n}$
只能输入零和非零开头的数字:^(0|[1-9][0-9]*)$
只能输入有两位小数的正实数:^[0-9]+(.[0-9]{2})?$
只能输入有1-3位小数的正实数:^[0-9]+(.[0-9]{1,3})?$
只能输入非零的正整数:^+?[1-9][0-9]*$
只能输入非零的负整数:^-[1-9][0-9]*$
只能输入长度为3的字符:^.{3}$
只能输入由26个英文字母组成的字符串:^[A-Za-z]+$
只能输入由26个大写英文字母组成的字符串:^[A-Z]+$
只能输入由26个小写英文字母组成的字符串:^[a-z]+$
只能输入由数字和26个英文字母组成的字符串:^[A-Za-z0-9]+$
只能输入由数字、26个英文字母或者下划线组成的字符串:^w+$

总结于 W3Cschool - 常用正则表达式大全

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//数字转货币格式
let number = '12345678.2333';
number.replace(/(?=(?!^)(?:\d{3})+(?:\.|$))(\d{3}(\.\d+$)?)/g, ',$1'); //=>12,345,678.2333

//取URL中的文件名
let url = "https://vincef0ng.cn/post/js-regexp-guide/index.html";
url.replace(/(.*\/){0,}(.*)/ig,"$2"); //=>index.html

/*是否带有小数*/
function isDecimal(strValue ) {
var objRegExp= /^\d+\.\d+$/;
return objRegExp.test(strValue);
}

/*校验是否中文名称组成 */
function ischina(str) {
var reg=/^[\u4E00-\u9FA5]{2,4}$/; /*定义验证表达式*/
return reg.test(str); /*进行验证*/
}

/*校验是否全由8位数字组成 */
function isStudentNo(str) {
var reg=/^[0-9]{8}$/; /*定义验证表达式*/
return reg.test(str); /*进行验证*/
}

/*校验电话码格式 */
function isTelCode(str) {
var reg= /^((0\d{2,3}-\d{7,8})|(1[3584]\d{9}))$/;
return reg.test(str);
}

/*校验邮件地址是否合法 */
function IsEmail(str) {
var reg=/^\w+@[a-zA-Z0-9]{2,10}(?:\.[a-z]{2,4}){1,3}$/;
return reg.test(str);
}

参考文档:

文章作者: Vincent F0ng
文章链接: https://vincef0ng.cn/post/js-regexp-guide/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Vincent F0ng

评论(支持Markdown)