转自:
https://www.runoob.com/js/js-regexp.html
https://www.runoob.com/jsref/jsref-obj-regexp.html
https://www.cnblogs.com/dogecheng/p/11466687.html
语法
/正则表达式主体/修饰符(可选)
例子:
/Runoob/i
其中,runoob 是一个正则表达式主体 (用于检索);i 是一个修饰符 (搜索不区分大小写)。
正则表达式修饰符
修饰符 | 描述 |
---|---|
i | 执行对大小写不敏感的匹配 |
g | 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止) |
m | 执行多行匹配 |
正则表达式模式
1、括号
表达式 | 描述 |
---|---|
(n) | 表示捕获分组,会把每个分组里的匹配的值保存起来,从左向右,以分组的左括号为标志,第一个出现的分组的组号为1,第二个为2,以此类推。 |
(?:n) | 表示非捕获分组,和捕获分组唯一的区别在于,非捕获分组匹配的值不会保存起来。 |
(red|blue|green) | 表示“或”字符,会保存该分组内任何以 | 隔开的选项。 |
例子:
以下例子中,/(?:[0-9]*)/ 匹配的第一个 /[0-9]*/ 没有保存下来,即没有保存匹配到的“123”,而 /([0-9]*)/ 则保存了下来:
以下例子结合使用了(?:n) 和 (|) 来组合一个模式的各个部分,/industr(?:y|ies)/ 相当于 /industry|industries/ 的一个更简略的表达式,这是因为单独存储下 “y” 或者 “ies” 没有意义:
2、方括号
方括号用于查找某个范围内的字符:
表达式 | 描述 |
---|---|
[abc] | 查找方括号之间的任何字符 |
[^abc] | 查找任何不在方括号之间的字符 |
[0-9] | 查找任何从 0 至 9 的数字 |
[a-z] | 查找任何从小写 a 到小写 z 的字符 |
[A-Z] | 查找任何从大写 A 到大写 Z 的字符 |
[A-z] | 查找任何从大写 A 到小写 z 的字符 |
[adgk] | 查找给定集合内的任何字符 |
[^adgk] | 查找给定集合外的任何字符 |
3、元字符
元字符(Metacharacter)是拥有特殊含义的字符:
元字符 | 描述 |
---|---|
. | 查找单个字符,除了换行和行结束符 |
\w | 查找数字、字母及下划线 |
\W | 查找非单词字符 |
\d | 查找数字 |
\D | 查找非数字字符 |
\s | 查找空白字符 |
\S | 查找非空白字符 |
\b | 匹配单词边界 |
\B | 匹配非单词边界 |
\0 | 查找 NULL 字符 |
\n | 查找换行符 |
\f | 查找换页符 |
\r | 查找回车符 |
\t | 查找制表符 |
\v | 查找垂直制表符 |
\xxx | 查找以八进制数 xxx 规定的字符 |
\xdd | 查找以十六进制数 dd 规定的字符 |
\uxxxx | 查找以十六进制数 xxxx 规定的 Unicode 字符 |
4、量词
量词 | 描述 |
---|---|
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 的序列的字符串(X为正整数)。 /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 的字符串。 /Windows(?=95|98|NT|2000)/ 能匹配 “Windows2000” 中的 “Windows” ,但不能匹配 “Windows3.1” 中的 “Windows” 。 |
?!n | 匹配任何其后没有紧接指定字符串 n 的字符串。 /Windows(?!95|98|NT|2000)/ 能匹配 “Windows3.1” 中的 “Windows” ,但不能匹配 “Windows2000” 中的 “Windows” 。 |
?<=n | 匹配任何其前紧接指定字符串 n 的字符串。 /(?<=95|98|NT|2000)Windows/ 能匹配 “2000Windows” 中的 “Windows” ,但不能匹配 “3.1Windows” 中的 “Windows” 。 |
?<!n | 匹配任何其前没有紧接指定字符串 n 的字符串。 /(?<=95|98|NT|2000)Windows/ 能匹配 “3.1Windows” 中的 “Windows” ,但不能匹配 “2000Windows” 中的 “Windows” 。 |
正则表达式对象方法
1、test() 对象方法
test() 方法用于检测一个字符串是否匹配某个模式,如果字符串中含有匹配的文本,则返回 true,否则返回 false。
例子:
以下实例用于搜索字符串中的字符 “e”
/e/.test("The best things in life are free!");
2、exec() 对象方法
exec() 方法用于检索字符串中的正则表达式的匹配。该函数返回一个数组,其中存放匹配的结果。如果未找到匹配,则返回值为 null。
例子:
以下实例用于搜索字符串中的字母 “e”
/e/.exec("The best things in life are free!");
3、toString() 对象方法
toString() 方法返回正则表达式的字符串。
例子:
以下实例用于返回正则表达式的字符串值
var patt = new RegExp("RUNOOB", "g");
var res = patt.toString(); // 输出/RUNOOB/g
更多示例
1、判断输入字符串是否为数字、字母、下划线组成
/^\w+$/.test(str);
解析:
- ^表示开始字符串
- $表示结束字符串
- \w表示 [a-zA-Z0-9_]
- +表示一个或者多个\w
2、判断字符串是否全部为字母
function isLetter(str) {
return /^[a-zA-Z]+$/.test(str);
}
3、判断字符串是否全部为数字
/^\d+$/.test(str);
4、判断字符串是否带有小数
/^\d+\.\d+$/.test(str);
5、判断字符串是否中文名称组成
/^[\u4E00-\u9FA5]{2,4}$/.test(str);
6、判断字符串是否全由8位数字组成
/^[0-9]{8}$/.test(str);
7、校验电话码格式
/^((0\d{2,3}-\d{7,8})|(1[3584]\d{9}))$/.test(str);
8、校验邮件地址是否合法
/^\w+@[a-zA-Z0-9]{2,10}(?:\.[a-z]{2,4}){1,3}$/.test(str);
9、匹配百度网盘链接
/**
* [reg 百度网盘链接匹配]
* 说明:匹配支持百度分享的两种链接格式
* 格式一:链接: https://pan.baidu.com/s/15gzY8h3SEzVCfGV1xfkJsQ 提取码: vsuw 复制这段内容后打开百度网盘手机App,操作更方便哦
* 格式二:http://pan.baidu.com/share/link?shareid=179436&uk=3272055266 提取码: vsuw 复制这段内容后打开百度网盘手机App,操作更方便哦
* 匹配出下载地址和提取码,并且还支持如果没有提取码,也能匹配出下载链接。
* @type {正则表达式}
* @return array 返回匹配成功的链接和地址
*/
function baiduDownLinkArr(string){
var reg = /([http|https]*?:\/\/pan\.baidu\.com\/[(?:s\/){0,1}|(share)]*(?:[0-9a-zA-Z?=&])+)(?:.+:(?:\s)*)?([a-zA-Z]{4})?/;
console.log(reg.exec(string));
}
10、捕获并转换时间格式
const str = '20210426141823';
const s = str.replace(/(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})/, (_, ...args) => {
const [year, month, day, h, d, s] = args;
return `${year}年${month}月${day} ${h}时${d}分${s}秒`
});
console.log(s); // 2021年04月26 14时18分23秒