概念:
按照某种规则匹配符合条件的字符串
语法:
元字符:
在正则表达式有特殊含义的非字母字符
- 边界类
^:匹配开头
&:匹配结尾
/b:匹配边界 - 范围类
[a-zA-Z] - 预定义类
\d: 数字
\w:字母数字下划线
\s:空格
.:除了回车或换行符的所有字符 - 量词
?: 0或1
+:1或多次
*: 0或多次
{n}:出现n次
{n, m}: 出现n到m次
{n,}:至少出现n次 - 修饰符:
g: 全局搜索
i: 忽略大小写
M: 多行搜索
贪婪模式和非贪婪模式
贪婪模式:尽可能多的匹配
非贪婪模式:尽可能少的匹配----做法:在量词后加?
分组
- 用()来分组, 使量词作用于分组
- 用|表示或
- $表示反向引用, 如$1, 需要分组的内容记得加括号
- 分组内加上(?:)则不捕获该分组 例子:(?:\d)(\w) \w为$1的内容
前瞻和后顾
正则表达式是从头部向尾部解析,所以尾部是前,头部是后
正则表达式匹配到规则到时候,向前检查字符串是否符合断言,后顾则相反(JS不支持后顾)
符合或不符合特定断言称为正向匹配或者负向匹配
- 正向前瞻: exp(?=assert) 例:\d(?=\w)
- 负向前瞻: exp(?!assert)
- 正向后顾: exp(?<=assert) (js不支持)
- 负向后顾: exp(?<!assert)(js不支持)
JS的正则表达式
RegExp实例化
- 字面量
var reg = /\big\b/ - 构造函数
var reg = new RegExp(‘\bis\b’, ‘g’);
RegExp对象属性
- global
- ignore
- multiline
- lastIndex
- source
RegExp常用方法
- test 返回 true false
- exec 返回null 或结果数组( 返回结果有点绕,建议看文档)
结果数组分全局调用和非全局调用
字符串对象常用方法
- search 返回 index 或 -1 忽略全局匹配
- match 返回null或数组 分全局调用和非全局调用
- split
- replace
str.replace(regexp|substr, newSubStr|function)
function参数
match:匹配的子串
$1,$2……
index: 匹配到的子字符串在原字符串中的偏移量
string:被匹配的原字符串
NamedCaptureGroup:命名捕获组匹配的对象
习题
给一个连字符串例如:get-element-by-id转化成驼峰形式。
function transform(string){
return string.replace(/-\w/g, function(match){
return match.slice(1).toUpperCase();
})
}
function transform(string){
return string.replace(/(-)(\w)/g, function(match, $1, $2){
return $2.toUpperCase();
});
}
匹配二进制数
var str = "10101111";
var reg = /^[01]+$/g;
reg.test(str);
var str = "10101111";
var reg = /^(0|1)+$/g;
reg.test(str);
非零的十进制数字 (有至少一位数字, 但是不能以0开头)
var str = '1'
var reg = /^[^0]\d*$/g;
reg.test(str);
匹配一年中的12个月
var str = "12";
var reg = /^(1[0-2])|(0?[1-9])$/g
reg.test(str);
匹配qq号最长为13为
var str = '1222222222';
var reg = /[1-9]\d{4,12}/g
reg.test(str);
分割数字每三个以一个逗号划分
var str = '122456789';
var reg = /(\d{3})/g;
str.replace(reg, '$1,');