正则表达式
一、正则表达式教程:https://www.w3cschool.cn/zhengzebiaodashi/regexp-metachar.html 或 https://www.imooc.com/learn/706 (推荐,慕课网讲解的比较好)
二、图形化 (可视化) 正则表达式 编辑 工具:https://regexper.com/ (推荐,可以配置在本地的) 或 https://jex.im/regulex (不是很明确) 或 https://www.iteye.com/news/29859 (涉及 五款 这种工具)
三、正则表达式手册:http://tool.oschina.net/uploads/apidocs/jquery/regexp.html
正则表达式中的()类似于算数运算中的(),里面运算后的结果和后面运算。
四、在线正则表达式测试 : http://tool.oschina.net/regex/ (这个了,里面忽略了m修饰符)
http://tools.jb51.net/tools/regex.asp (里面测试不正确,这个正则表达式测试包括3个修饰符,还有明确的匹配方法)
exec()方法是正则表达式的方法,eg: patt.exec("The best things in life are free");
match()是字符串的方法,eg: str.match(/ain/g)
五、正则表达式 讲解 (慕课网听课笔记)
1、正则表达式由两种基本字符类型组成:
a、原义文本字符
b、元字符
2、字符类: [ ] (类匹配的是一个字符)
匹配里面的任意一个字符(不是字符串),如:[abc], a、b、c是独立的,不是一个字符串
3、反向字符类: [^ ] 某一类中取相反的。
4、范围类:[a-z]
如果范围类中要匹配 - ,只要-字符放在范围类外面就可以 如:[a-z-]
5、预定义类: 使用一种预定好的字符,代表某一种字符类。如:d 表示 [0-g]的类
字符 | 等价类 | 含义 |
. | [^ ] | 除了回车符和换行符之外的所有字符 |
d | [0-9] | 数字字符 |
D | [^0-9] | 非数字字符 |
s | [ x0Bf ] | 空白字符 |
S | [^ x0Bf ] | 非空白符 |
w | [a-zA-Z_0-9] | 单词字符(字符、数字下划线) |
W | [^a-zA-Z_0-9] | 非单词字符 |
6、边界: (边界不包含字符,但是它描述后面或前面字符的边界所在)
^ | 以xxx开始 |
$ | 以xxx结束 |
单词边界 | |
B | 非单词边界 |
7、m修饰符:
没有m修饰符,多行字符串,只有一个^和一个$边界。
有m修饰符,多行匹配,每一行都有一个^和$边界
8、量词:(就是多少次,如果没有量词,则匹配一个连续多个相同的字符的话,就必须使用字符类不断的叠加,如:dddddddd)
? | 零次或一次(最多出现一次) |
+ | 出现一次或多次(至少一次) |
* | 出现零次或多次(任意次) |
{n} | 出现n次 |
{n,m} | 出现n到m次 |
{n,} | 至少出现n次 |
9、js正则贪婪模式与贪婪模式(默认是贪婪模式):这个是决定 匹配 到哪个长度为止 https://www.cnblogs.com/rambo-yi/p/10035652.html
在量词后 加上?就可以设置成非贪婪模式
比如说匹配输入串A: 101000000000100 匹配 两个1之间的字符串: 贪婪匹配【默认的】表达式: 1.*1 ===> 匹配到 1010000000001 非贪婪匹配 表达式 : 1.*?1 ===> 匹配到 101
10、分组: 用()表示 https://www.cnblogs.com/wancheng7/p/8906015.html
说明: 就是以字符串为一个整体,而不是前面的字符类,主要是解决量词作用在一组字符串上而不是前面的一个字符类中
10.1、分组的 捕获(默认是捕获模式):这个是分组中一个比较实用的概念。 https://blog.csdn.net/lihefei_coder/article/details/53022253
如果不想捕获某个分组,在括号里加 ?:,如 (?:abc)
实例: 分组捕获可以使用变量来代替分组的内容。参考 https://www.imooc.com/video/12534
如:实现下面的转化 2015-12-25 => 12/25/2015 (前后顺序是不一样的); url获取参数也用到分组的捕获
10.2、非捕获型 :(不希望捕获某些分组,在分组内加上?:就可以了)
10.3、分组的 前瞻: 参考 https://blog.csdn.net/lihefei_coder/article/details/53022253
正向前瞻(?=表达式)表示后面要有什么;
反向前瞻(?!=表达式)表示后面不能有什么
正向前瞻 | exp(?=assert) |
负向前瞻 | exp(!assert) |
11、或:(一般都是在分组中,不在分组中就把整个正则表达式 进行 或操作了)
15、正则表达式 属性(即3个修饰符):
global:是否全局搜索,默认false
ignore case:是否大小写敏感,默认false
multiline:多行搜索,默认false
lastIndex:不常用
source:不常用
六、正则表达式 项目中的使用:
1、获取url上的参数:(参数需要解码的话,都是先获取参数值,在对其使用 decodeURIComponent 解码)
a、https://www.baidu.com/?testid=787dfdfd87&city=beijign (没有#号,或#号在后面。)
关键点:location.search 属性可以获取 url上与路径相接的第一个 ?号(含 ?号) 到 #号之间的字符串(没有#号 一直到结束,#号后面的?使用location.search是获取不到的);
str.match(reg) 方法,reg非全局时,匹配到数据,返回一个数组,数组中会包含reg 分组中匹配到的字符串,如:"test=787d7&city=bein/".match(/(^|&)test=([^&]*)(&|$)/),返回来的数组,会含正则中(^|&)、([^&]*)、(&|$)/) 这三个分组匹配的字符串。
var str = location.search.substr(1) // 截取到 参数开头的字符串 str.match(/(^|&)testid=([^&]*)(&|$)/)[2] // 直接获取到第二个分组([^&]*)的字符串,即我们需要的字符串 最后获取到的字符串需要考虑下需不需要编码
b、https://www.baidu.com/#/index?testid=787dfdfd87&city=beijign ( #号好在 ?号的前面) 参考:https://www.cnblogs.com/wenjunwei/p/9698379.html
关键点:location.hash 属性可以获取url上 #号后面的所有字符串;
var str = location.hash.split("?")[1] // 截取到 参数开头的字符串 str.match(/(^|&)testid=([^&]*)(&|$)/)[2] // 这里和上面是一样的 , 需要解码的话,使用 decodeURIComponent
c、https://www.baidu.com/?testid=787dfdfd87&city=beijign/#/index?age=78 ( #号在两个问号之间)
说明:这种情况一般是微信公众号网页会出现这种情况。vue开发的带#号单页面 放在微信公众号中,微信给的认证参数是放在#号前面的,而我们自己的参数一般是在url 后面,即#的后面。
如:https://test.iconntech.com/prize-front/?code=011RxtQa0IfdBy1M01Pa09McQa0RxtQe&state=STATE#/index?actId=363 这里code参数是微信平台 给的参数,actId是 自己的服务器配置的。
关键点:实际项目中 我们需要的参数 在 # 的哪一边是 ,肯定是知道,且一个项目中肯定是固定的。可以根据具体情况使用上面的其中一种方法 获取到相应的参数。
如果不知道 大不了通过 location.search 和 location.hash 两端都去匹配就可以了(两段字符串 分别使用上面的方法处理)。