正则表达式
一、正则表达式教程: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个修饰符,还有明确的匹配方法)
1、正则表达式由两种基本字符类型组成:
a、原义文本字符
b、元字符
2、字符类: [ ] (类匹配的是一个字符)
匹配里面的任意一个字符(不是字符串),如:[abc], a、b、c是独立的,不是一个字符串
3、反向字符类: [^ ] 某一类中取相反的。
4、范围类:[a-z]
如果范围类中要匹配 - ,只要-字符放在范围类外面就可以 如:[a-z-]
5、预定义类: 使用一种预定好的字符,代表某一种字符类。如:\d 表示 [0-g]的类
| 字符 | 等价类 | 含义 |
| . | [^\r\n] | 除了回车符和换行符之外的所有字符 |
| \d | [0-9] | 数字字符 |
| \D | [^0-9] | 非数字字符 |
| \s | [\t\n\x0B\f\r] | 空白字符 |
| \S | [^\t\n\x0B\f\r] | 非空白符 |
| \w | [a-zA-Z_0-9] | 单词字符(字符、数字下划线) |
| \W | [^a-zA-Z_0-9] | 非单词字符 |
6、边界: (边界不包含字符,但是它描述后面或前面字符的边界所在)
| ^ | 以xxx开始 |
| $ | 以xxx结束 |
| \b | 单词边界 |
| \B | 非单词边界 |
说明:单词边界 和 非单词边界 https://mp.weixin.qq.com/s/zSJXdaj5pLw_1I8lUPiKEA
7、m修饰符:
没有m修饰符,多行字符串,只有一个^和一个$边界。
有m修饰符,多行匹配,每一行都有一个^和$边界
8、量词:(就是多少次,如果没有量词,则匹配一个连续多个相同的字符的话,就必须使用字符类不断的叠加,如:\d\d\d\d\d\d\d\d)
| ? | 零次或一次(最多出现一次) |
| + | 出现一次或多次(至少一次) |
| * | 出现零次或多次(任意次) |
| {n} | 出现n次 |
| {n,m} | 出现n到m次 |
| {n,} | 至少出现n次 |
在量词后 加上?就可以设置成非贪婪模式
比如说匹配输入串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) |
var str = location.search.substr(1) // 截取到 参数开头的字符串 str.match(/(^|&)testid=([^&]*)(&|$)/)[2] // 直接获取到第二个分组([^&]*)的字符串,即我们需要的字符串 最后获取到的字符串需要考虑下需不需要编码
var str = location.hash.split("?")[1] // 截取到 参数开头的字符串 str.match(/(^|&)testid=([^&]*)(&|$)/)[2] // 这里和上面是一样的 , 需要解码的话,使用 decodeURIComponent