// 普通字符匹配
const str = 'hello RegExp';
/hello RegExp/.test(str); // true
/hello regexp/.test(str); // false
// i修饰符 不区分大小写
const str = 'hello RegExp';
/hello regexp/i.test(str); // true
// g修饰符 设置匹配为全局
const str = 'abcaaabcaa';
str.replace(/abc/, '000'); // 000aaabcaa
str.replace(/abc/g, '000'); // 000aa000aa
// m修饰符 设置匹配为多行
const str = '\b\t\nabc\b\t\n';
/^abc$/.test(str); // false
/^abc$/m.test(str); // true
// u修饰符(ES6) 用来正确处理大于\uFFFF的 Unicode 字符。
/^\uD83D/u.test('\uD83D\uDC2A'); // false
/^\uD83D/.test('\uD83D\uDC2A'); // true
// y修饰符(ES6) 与g修饰符类似, 但开始位置不同
const str = 'aaa_aa_a';
const r1 = /a+/g;
const r2 = /a+/y;
r1.exec(str) // ["aaa"]
r1.exec(str) // ["aa"]
r2.exec(str) // ["aaa"]
r2.exec(str) // null
// s修饰符(ES7) 使.能够匹配一切字符
/./.test('\n'); // false
/./s.test('\n'); // true
// 量词 {n} 匹配n个
/ab{2}/.test('ab'); // false
/ab{2}/.test('abb'); // true
// 量词 {n,m} 匹配 >= n 且 <= m 个
/ab{2,3}/.test('ab'); // false
/ab{2,3}/.test('abb'); // true
/ab{2,3}/.test('abbb'); // true
// 量词 {n,} 匹配 >= n 个
/ab{2,}/.test('ab'); // false
/ab{2,}/.test('abbbb'); // true
// 量词 ? 相当于 {0,1} 匹配0个或1个
/ab?/.test('a'); // true
/ab?/.test('ab'); // true
// 量词 + 相当于 {1,} 匹配至少1个
/ab+/.test('a'); // false
/ab+/.test('abbb'); // true
// 量词 * 相当于 {0,} 匹配任意个
/ab*/.test('a'); // true
// 贪婪量词, 只要首尾匹配即算匹配
/.*</.exec('1<545345<3234234'); // ['1<545345<']
// 惰性量词 .*? 匹配最少的
/.*?</.exec('1<545345<3234234'); // ['1<']
// 惰性量词 {n,m}? +? *? 懒惰量词只会匹配最少的
/ab{2,}/.exec('abbbbbbb'); // ['abbbbbbb']
/ab{2,}?/.exec('abbbbbbb'); // ['abb']
// 边界^锚位符, 匹配开始
/bc/.test('abc'); // true
/^bc/.test('abc'); // false
// 边界$锚位符, 匹配开始
/ab/.test('abc'); // true
/ab$/.test('abc'); // false
// 边界 \b 单词边界
/get\b/.test('gets'); // false
/get\b/.test('get'); // true
// 选择
/(h|H)ello/.test('hello'); // true
/(h|H)ello/.test('Hello'); // true
// 分组
/(h|H)ello (\w+)/.exec('hello world'); // ['hello', 'h', 'world']
/(?:h|H)ello (\w+)/.exec('hello world'); // ['hello', 'world']
// 具名分组
const data = /(?<year>\d{4})-(?<month>\d{2})-(?<day>\d{2})/.exec('2018-01-01');
data.groups; // {day: "01", month: "01", year: "2018"}
// 具名分组匹配
/^(?<say>hello)\w+\1$/.test('helloworldhello');
/^(?<say>hello)\w+\k<say>$/.test('helloworldhello');
// 先行断言(?= ) (?! )
// 正断言
'hello Mtshen, hello world'.replace(/hello(?= Mtshen)/g, 'hi'); // hi Mtshen, hello world
// 负断言
'hello Mtshen, hello world'.replace(/hello(?! Mtshen)/g, 'hi'); // hello Mtshen, hi world
// 后行断言 (?<= ) (?<! )
// 正断言
'hello Mtshen, Hi Mtshen'.replace(/(?<=hello )Mtshen/g, 'shenMengTao'); // "hello shenMengTao, Hi Mtshen"
// 负断言
'hello Mtshen, Hi Mtshen'.replace(/(?<!hello )Mtshen/g, 'shenMengTao'); // "hello Mtshen, Hi shenMengTao"
// 字符集合
/^[ab]$/.test('a'); // true
/^[ab]$/.test('b'); // true
/^[ab]$/.test('c'); // false
// 区间写法
/^[a-b]$/.test('a'); // true
/^[a-b]$/.test('b'); // true
/^[a-b]$/.test('c'); // false
// 可以使用元字符, 但分组不生效
/^[\w]$/.test('a'); // true
// 可以使用非
/^[^ab]$/.test('a'); // false
/^[^ab]$/.test('c'); // true
// 元字符
// 数值\d
/\d/.test('0'); // true
/\d/.test('a'); // false
// 非数值\D
/\D/.test('0'); // false
/\D/.test('a'); // true
// 文本\w, 文本包括0-9
/\w/.test('0'); // true
/\w/.test('a'); // true
/\w/.test('-'); // false
// 非文本\W
/\W/.test('a'); // false
/\W/.test('-'); // true
/\f/.test('\f'); // \f 匹配换行符
/\n/.test('\n'); // \n 匹配回车符\n
/\r/.test('\r'); // \t 匹配回车符\r
/\t/.test('\t'); // \t 匹配垂直制表符
/\s/.test(' '); // true \s 匹配空白字符, 相等于匹配 \f\n\r\t\v
/\S/.test(' '); // false \S 匹配非空白字符
正则表达式
©著作权归作者所有,转载或内容合作请联系作者
- 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
- 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
- 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...