正则表达式学习

1. 基础语法

  • . - 除换行符以外的所有字符。
  • ^ - 字符串开头。
  • $ - 字符串结尾。
  • \d,\w,\s - 匹配数字、字符、空格。
  • \D,\W,\S - 匹配非数字、非字符、非空格。
  • [abc] - 匹配 a、b 或 c 中的一个字母。
  • [a-z] - 匹配 a 到 z 中的一个字母。
  • [^abc] - 匹配除了 a、b 或 c 中的其他字母。
  • aa|bb - 匹配 aa 或 bb。
  • {n} - 匹配 n次。
  • {n,} - 匹配 n次以上
  • {m,n} - 最少 m次,最多n次匹配
  • ? - 0 次或 1 次匹配 等价于{0,1}
  • * - 匹配 0 次或多次 等价于{0,}
  • + - 匹配 1 次或多次 等价于{1,}
  • (expr) - 捕获expr子模式,以 \1 使用它。

ps: {n}{n,}{m,n}?*+只匹配前一个字符

abc+ : 匹配 abc、abcc、 abccc等

a[bc]+: 匹配ab、ac、abb、abc、acb等

a(bc)+: 匹配abc、abcbc、abcbcbc等

a|b|c+: 注意这个+与c绑定,实际匹配的是a、b、c、cc、ccc、cccc等

^abc : 匹配以abc开头的字符串

.: 对应除换行符以外的所有字符,但只对应一个字符,.+ 匹配除换行符以外的所有字符

2. 括号的用法

() 是组,可以是表达式

--() 匹配的是组,可以是多个字符,匹配保存结果,即产生数组保存对应的对个值,可以使用$1获取第一个匹配值
(abc| bac| cba) 匹配abc或bac或cba,顺序固定
-- (?)以?开头的为非获取匹配,只匹配不保存结果,即不产生数组
tr(?=y|ies|ying|ied) 该方式等同于try|tries|trying|tried
a(?=bc) 匹配以abc顺序出现的a                     (?<=bc)a  前置匹配,匹配以bca顺序出现的a
a(?!bc) 匹配不以abc顺序出现的a   如:ac中的a       (?

[] 是定义匹配的字符范围

 -- [] 匹配单个字符
[1-9] 匹配1到9的数字
[135] 匹配1、3、5中的数字
[?*+(a)]  注意,[]中特殊字符不需要转义即可使用,这里匹配?、*、+、(、a、)中的任一字符,并不是表达式
[]中有用的符号为:
1. ^ 取反 ^a即除a以外的字符
2. - 区间 a-z即 a到z的字母
3. \ 匹配特殊字符: 换行(\n) 中文(\u4e00-\u9fa5)等

{} 用来匹配的长度

{n} - 匹配 n次。
{n,} - 匹配 n次以上
{m,n} - 最少 m次,最多n次匹配

3. 优先级

正则表达式从左到右进行计算,并遵循优先级顺序,这与算术表达式非常类似

运算符 描述
\ 转义符
(), (?:), (?=), [] 圆括号和方括号
*, +, ?, {n}, {n,}, {n,m} 限定符
^, $, \任何元字符、任何字符 定位点和序列(即:位置和顺序)
| 替换,"或"操作 字符具有高于替换运算符的优先级,使得"m|food"匹配"m"或"food"。若要匹配"mood"或"food",请使用括号创建子表达式,从而产生"(m|f)ood"。

4.修饰符

通常使用g/[1-9]/g

修饰符 含义 描述
i ignore - 不区分大小写 将匹配设置为不区分大小写,搜索时不区分大小写: A 和 a 没有区别。
g global - 全局匹配 查找所有的匹配项。
m multi line - 多行匹配 使边界字符 ^$ 匹配每一行的开头和结尾,记住是多行,而不是整个字符串的开头和结尾。
s 特殊字符圆点 . 中包含换行符 \n 默认情况下的圆点 . 是匹配除换行符 \n 之外的任何字符,加上 s 修饰符之后, . 中包含换行符 \n。

5. 非贪婪

*和 +限定符都是贪婪的,它们会尽可能多的匹配文字。但是加上?将变成非贪婪表达式、最小匹配

 hello 
<.*>    匹配 hello 
<.*?>   匹配

6. 实例

var str = 'abc abc 123';
str.replace(/(ab)c/g,'$1f');  // 得到结果 'abf abf 123'

let hd = "=你好+";
console.log(hd.replace(/你好/g, "$`$`$&$'$'"));  //===你好+++

hd = "(010)99999999";
console.log(hd.replace(/\((\d{3,4})\)(\d{7,8})/g, "$1-$2")); //010-99999999

// 将123456789 => 123,456,789
//步骤1  使用前面的(?=),匹配3个数字,但是不会保存为数组
let price = '123456789'
let priceReg = /(?=\d{3}$)/
console.log(price.replace(proceReg, ',')) // 123456,789
//步骤2 通过将(\d{3}) 单独划分组,匹配多项
let priceReg = /(?=(\d{3})+$)/g
console.log(price.replace(priceReg, ',')) // ,123,456,789
//步骤3 去掉首个,
let priceReg = /(?!^)(?=(\d{3})+$)/g
console.log(price.replace(priceReg, ',')) // 123,456,789

//提取a标签中的链接
var str = ``
console.log(str.replace(//, "$2")) //  /index

你可能感兴趣的:(正则表达式学习)