6.正向与反向预查
"Swift1 Swift2 Swift3Swift4Swift4Swift4"
(Swift4) 匹配Swift4并获取这一匹配,然后存储供以后使用;
(Swift4)\1 匹配Swift4Swift4,其中\1即表示使用了存储的匹配(存储的第一个匹配),相当于匹配两次Swift4;
(Swift3)(Swift4)\2 匹配Swift3Swift4Swift4,其中\2即表示使用了存储的第二个匹配,即Swift4(当然第一个匹配为:Swift3);
(?:Swift3)(Swift4)\1 匹配Swift3Swift4Swift4,与(Swift3)(Swift4)\2相同;
由于在小括号中使用了?:,所以第一个匹配(Swift3)没有被存储,只存储了后面的第二个匹配(Swift4);
若写成(?:Swift3)(Swift4)\2,则正则表达式错误,因为没有存储第二个匹配;
其中”?:”的作用是匹配Swift3模式字符串,但不会存储该匹配.
Swift(?=4) 匹配右边紧跟着4的Swift;
其中(?=)称为:正向预查匹配, (?=4)表示先看看有没有4,如果有,则把4左边的Swift匹配出来;如果没有,则继续向右查看,这个过程就是正向预查匹配.
Swift(?!4) 匹配右边不跟着4的Swift;
其中(?!)称为:正向预查不匹配, (?!4)表示先看看有没有4,如果没有,也即不等于4的情况,则把左边的Swift匹配出来;如果有,则继续向右查看,这个过程就是正向预查不匹配.
(?<=4)Swift 匹配左边紧跟着4的Swift,即第五个Swift单词,索引为26到30的字符;
其中(?<=)称为:反向预查匹配, (?<=4)表示先看看有没有4,如果有,则把4右边的Swift匹配出来;如果没有,则继续向右查看,这个过程就是反向预查匹配.
(?<!4)Swift 匹配左边不跟着4的Swift,即第1、2、3、4、6个Swift单词;
其中(?<!)称为:反向预查不匹配, (?<!4)表示先看看有没有4,如果没有,也即不等于4的情况,则把右边的Swift匹配出来;如果有,则继续向右查看,这个过程就是反向预查不匹配.
https://www.jianshu.com/p/6c057350e7c8
demo
1.text: abc5 abc7
capture:abc
abc(?!4)
2.
text abc4
capture:abc
abc(?=4)
3.
text 4abc
capture: abc
(?<=4)abc
4.text zabc dabc
capture abc
(?<!4)abc
5.
(?:s)bc(e) 意思是用/1 /2取括號的東西不包含(?:s)這個