开发人员在做web开发时候,时不时的会遇到正则匹配某段落的某些字符串,这里就要使用正则来匹配了,我在Magento 2开发过程中也常常遇到这样的问题。
如何使用正则呢?
简单的正则大家在网上随便百度下就可以收到,但是接下来的我将为大家在SKY8G网上讲述,正则的高级教程,驶入和使用的。
A. 如果想在某段落中匹配包含某个字符串
字符串段
1 2 | www.sky8g.com wo men shi sky8g |
正则表达式
1 | ^.*\b(sky8g\.com)\b.*$ |
这样我们只匹配第一行的字符串,因为包含了sky8g.com 这个字符串,所以匹配。
B. 如果想在某段落中匹配不包含(不匹配)某个字符串
字符串段
1 2 | www.sky8g.com wo men shi sky8g |
正则表达式
1 | ^((?!sky8g\.com).)*$ |
这样我们只匹配第二行的字符串,因为第二行不包含了sky8g.com 这个字符串,所以匹配。
C. 详细讲解(?=)、(?:)、(?!)这三个的关系和联系
例如下列的例子:
1 2 3 | a(?=lo) :只匹配a后面是lo的整体组合,例如 abc hello ni halo 只匹配第二个a a(?!lo) :只匹配a后面不是lo的表达式,例如 abc hello ni halo 只匹配第一个a a(?:lo) :只匹配a后面是lo的表达式整体组合,例如 abc hello ni halo 匹配第二个a和lo,即使匹配alo |
JS代码例子参考:
1 2 3 | 'adki alodd'.replace(/(a)(?:(lo))/g,"$2"); //即使$1 为 a ,$2为lo ,最外面的哪个不创建捕获组 输出:"adki lodd" |
总结
为了跟大家更好的记忆这三个的关系我组织了一下,供大家参考
1 2 3 4 | * () 捕获组 - 括号内的正则表达式必须匹配,匹配创建捕获组 * (?:) 非捕获组 - 括号内的正则表达式必须匹配,但不能创建捕获组 * (?=) 积极向前看 - 匹配正则表达式必须匹配,不创建捕获组 * (?!) 非向前看 - 声称不可能匹配正则表达式,不创建捕获组 |
例如,a(?=b)匹配“ab”中的“a”,但不匹配“ac”中的“a”。
例如,a(?!b)匹配“ac”中的“a”,而不是“ab”中的“a”。
例如,a(?:b)将匹配“abc”中的“ab”,而a(?=b)仅匹配“abc” 中的“a”。
例子:
1 2 | /foo(?=b)(.*)/ /foo(?!b)(.*)/ |