正则表达式

正则表达式参考解析网址
https://regexper.com/


示例:
http:// 开头,.jpg 结尾的 去掉 http: 


http://xiaoguan.net/a.jpg 
https://xiaoguan.net/b.jpg 
http://xiaoguan.net/c.png
http://xiaoguan.net/d.jpg


正则表达式:

查找部分:http:(\/\/.+\.jpg) 

替换部分: $1 

sublime ide工具 替换演示

image

解析:注意 // 这种 需要转义 \/\/ , .jpg 的点也需要转义一下 \.jpg

http:// 开头  http:\/\/ , 

.+ 表示至少一个任意字符 = http:// 和 .jpg 中间部分的 xiaoguan.net

\.jpg 结尾为 .jpg的 


分组的概念 () 括号的作用就是分组 

比如 我们需要把 http://xiaoguan.net/a.jpg 的蓝色部分的 http: 部分去掉,红色部分的保留,这个时候,可以用分组的方式 把需要保留的部分 分到一个组里,替换为的内容就用分组里的 第一个分组 可以用 $1 表示。


实例2:找到所有的日期 把日期 统一换成 月-日-年的格式 

比如 2021-06-02 换成 06-02-2021

2020-06-02
2021/04/22
3431984-02/29
2020-04-09afsafaf


查找日期的正则表达式:

^\d{4}[-/]\d{2}[-/]\d{2}$

分组字符串:

^(\d{4})[-/](\d{2})[-/](\d{2})$

替换为:$2-$3-$1

解析:

^表示以\d{4}开始的 这样就可以排除掉 第3行的了

$表以\d{2}结尾的,这样就可以排除掉 第4行的了

\d{4} \d 表示数字 {4} 表示个数, 这样就可以匹配到 年份了 2021 ,2020 这样的连续4个数字的

同理 \d{2} 表示2位数字 匹配 月份和日期 

[-/] 这个中括号的作用是表示 或者 比如日期的间隔 有的是 / 有的是 - 这两种都有可能,所有就用了 [] 表示 匹配任意一个

image


实例3:用JS实现把下面字符串里的 is 替换为 大写的 IS;

var str = 'He is a boy. This is a dog. Where is she?'; 


方法1:

var txt = str.replace(/\bis\b/g,"IS");


方法2:

//使用构造函数 new RegExp

var reg = new RegExp('\\bis\\b','g');

var txt = str.replace(reg,'IS');


解析:

注意js中直接使用 要用 /.../做起止符。

最后一个字母 g 表示全部 如果不加,默认仅会替换第一个

除了g还有 i 表示不区分大小写,m 代表多行搜索


---范围类---

[a-z] 小写字母

[0-9] 数字

[a-zA-Z] 大小写字母

[a-zA-Z0-9] 大小写字母数字

2021-06-03 这种的 - 如果匹配 : [0-9-] 

image

---预定义类---

image

image

--- ^ $

image

------\b \B

image

---- 多行匹配 m


image


 

---量词---

QQ20210603-135204@2x

     10次 {10}

     最少10次{10,}

     最多10次 {0,10}


---贪婪模式-----先匹配大的6,满足就不匹配小的了

'12345678'.replace(/\d{3,6}/g,'X');

"X78"

---非贪婪模式-----先匹配小的3,满足就匹配

'12345678'.replace(/\d{3,6}?/g/,'X');

"XX78"


---分组----

联系出现 字母+数字 组合的3次的条件 

'a1b2c3d4'.replace(/([a-z]\d){3}/g,'X');

"Xd4"


---或---

'ByronCasper'.replace(/on|Ca/g,'X')

"ByrXXsper"


---反向引用---$1 

2021-06-03 -> 06.03.2021


'2021-06-03'.replace(/(\d{4})-(\d{2})-(\d{2})/g,'$2.$3.$1');

"06.03.2021"


---忽略分组---?:

welcome

(?:wel)(come)

wel这个分组就被忽略了  $1 就是 come


---前瞻--- 向前检测 是否符合 断言

image


'a2*e'.replace(/\w(?=\d)/g,'X');

"X2*e"

'a2*34V8'.replace(/\w(?=\d)/g,'X');

"X2*X4X8"

'a2*34VV'.replace(/\w(?=\d)/g,'X');

"X2*X4VV"



---后顾--- 先后检测 是否符合 断言 (JavaScript 不支持,忽略)


---对象属性-----

g 全局

i 不区分大小写

m 多行搜索

lastIndex 当前表达式匹配内容的最后一个字符的下一个位置

source 正则表达式文本字符串

image


---正则表达式方法---


测试 test 有匹配 true 否则 false

var rge1 = /\w/;

var rge2 = /\w/g;

reg1.test('a'); // true

注意:加了 /g 的时候,会lastIndex 的问题,导致正则匹配不准确问题,建议test 不要加g

image


while(reg2.test('ab')){

    console.log(reg2.lastIndex); //检测位置是变化的

}


exec 方法:

匹配到了 返回 匹配的数组,否则 返回 null


数组:
index 匹配字符串位置

input 存放被检索字符串的 string


image

非全局调用 没有 /g 的时候 lastIndex 是无效的一直是 0 


image


全局调用

image

---字符串方法----



search 方法


image

'a1b2c3d4'.search('1'); //1 第二位置找到了


'a1b2c3d4'.search('10'); //-1 没找到返回-1


可以用正则表达式

'a1b2c3d4'.search(/1/); //1 第二位置找到了 

注意 search 会自动忽略 g ,总是从头开始查

'a1b2c3d4'.search(/1/g); //1 g没起作用


match 方法


image


image


image


image


image


split 方法

image

image

replace 方法 - 字符串 或正则表达式 其实字符串执行的时候也会隐式的转成表达式

image


image



image

--- function 参数的应用 

a1b2c3d4e5 -> a2b3c4d5e6 ,这种需要运算的 替换 就可以用到 function 了

image


----带group的 function-----


image



-----正则表达式符号相关知识总结------

在正则表达式中,‘\d’表示匹配一个数字, ‘\S‘’表示匹配一个字符


‘.’ 代表匹配任意字符


‘*’表示任一个字符(包括0个)


‘+’表示至少一个字符


‘?’表示0个或1个


‘{n}’表示n个字符


‘{n,m}’表示n-m个字符


特殊字符需要‘\’转移符


[]表示范围,例如:[0-9a-zA-Z\_]  


A|B可以匹配A或B,所以(P|p)ython可以匹配'Python'或者'python'。


^表示行的开头,^\d表示必须以数字开头。


$表示行的结束,\d$表示必须以数字结束。


py也可以匹配'python',但是加上^py$就变成了整行匹配,就只能匹配'py'了。