// ---------- JavaScript RegExp ----------
/*
语法:
const patt=new RegExp(pattern,modifiers)
或
const patt=/pattern/modifiers
pattern(模式) 描述了表达式的模式
modifiers(修饰符) 用于指定全局匹配、区分大小写的匹配和多行匹配
*/
// 修饰符 - 用于执行区分大小写和全局匹配:
/*
i 执行对大小写不敏感的匹配。
g 执行全局匹配(查找所有匹配而非在找到第一个匹配后停止)。
m 执行多行匹配。
*/
// 方括号 - 用于查找某个范围内的字符:
/*
[abc] 查找方括号之间的任何字符。
[^abc] 查找任何不在方括号之间的字符。
[0-9] 查找任何从 0 至 9 的数字。
[a-z] 查找任何从小写 a 到小写 z 的字符。
[A-Z] 查找任何从大写 A 到大写 Z 的字符。
[A-z] 查找任何从大写 A 到小写 z 的字符。
[adgk] 查找给定集合内的任何字符。
[^adgk] 查找给定集合外的任何字符。
(red|blue|green) 查找任何指定的选项。
*/
// 元字符 - 是拥有特殊含义的字符:
/*
. 查找单个字符,除了换行和行结束符。
\w 查找数字、字母及下划线。
\W 查找非单词字符。
\d 查找数字。
\D 查找非数字字符。
\s 查找空白字符。
\S 查找非空白字符。
\b 匹配单词边界。
\B 匹配非单词边界。
\0 查找 NULL 字符。
\n 查找换行符。
\f 查找换页符。
\r 查找回车符。
\t 查找制表符。
\v 查找垂直制表符。
*/
// 量词
/*
*/
console.log('caandyazaaaa'.match(/a{1}/g))
const yuan_str_0 = ' J G s $ % ^ 2f & 9 % g _ - + = '
const yuan_reg_1 = /\s/g
console.log(yuan_str_0.match(yuan_reg_1), yuan_str_0.match(yuan_reg_1).length) // [ ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ' ] 18
const yuan_reg_00 = /\W/g
console.log(yuan_str_0.match(yuan_reg_00)) // [ ' ', ' ', ' ', ' ', ' ', '$', ' ', '%', ' ', '^', ' ', ' ', '&', ' ', ' ', '%', ' ', ' ', ' ', '-', ' ', '+', ' ', '=', ' ', ' ']
const yuan_reg_0 = /\w/g
console.log(yuan_str_0.match(yuan_reg_0)) // [ 'J', 'G', 's', '2', 'f', '9', 'g', '_' ]
const yuan_str_1 = "Thish isn't a good idea !"
const yuan_reg_10 = /\bis/g
console.log(yuan_str_1.match(yuan_reg_10))
let text_b_0 = "HELLO, LOOK AT YOU"
// let pattern_b_0 = /\bLO/
// let pattern_b_01 = /LO\b/
// const pt = text_b_0.match(pattern_b_0)
// console.log(pt, pt.length, pt[0], pt.join()) // [ 'LO', index: 7, input: 'HELLO, LOOK AT YOU', groups: undefined ] 1 LO LO
// console.log(text_b_0.match(pattern_b_01))
let pattern_b_1 = /\BLO/
console.log(text_b_0.match(pattern_b_1));
let text_b_1 = `LOHELLO, LOOK LOAT YOU`
const pat1 = /^LO/mg
console.log(text_b_1.match(pat1)) // [ 'LO' ]
text_b_1 = `LOHELLO,
LOOK
LOAT YOU`
pat1 = /^LO/mg
console.log(text_b_1.match(pat1)) // [ 'LO', 'LO', 'LO' ]
pat1 = /OU$/
console.log(text_b_1.match(pat2)) // [ 'OU', index: 21, input: 'LOHELLO, \nLOOK\nLOAT YOU', groups: undefined ]
console.log('1234'.replace(/^|$/g, '❀')) // "❀1234❀"
var str = "Is this all is there isth"
// 匹配 后面紧跟" t"的is
var patt1 = /is(?= t)/
console.log(str.match(patt1))
// 匹配 后面没有紧跟" t" 的is
patt1 = /is(?! t)/
console.log(str.match(patt1))
patt1 = /(?=(\d{3})+$)/g
console.log( '12345678'.replace(patt1, ',') ) // 12,345,678
console.log( '123456789'.replace(patt1, ',') ) // ,123,456,789
console.log( '0.12345678'.replace(patt1, ',') ) // 0.12,345,678
console.log( '1234.12345678'.replace(patt1, ',') ) // 1234.12,345,678
console.log( '123456.12345678'.replace(patt1, ',') ) // 123456.12,345,678
console.log(/^123$/.test(' 123 ')) //
console.log(/^123$/.test(' 124563 ')) //
console.log(/^123/.test('12 1234563 ')) //
console.log('object'.match(/[a-f]/g)); // [ 'b', 'e', 'c' ]
console.log('object'.match(/(a|b|e)/g)); // [ 'b', 'e' ]
console.log('object'.match(/t$/))
console.log('50'.match(/[1-6]/))
console.log('56'.match(/[1-5]6/))
var str = 'aaabbb';
var reg = /(a+)(?:b+)/;
var res = reg.exec(str);
console.log(res)
//["aaabbb", "aaa", index: 0, input: "aaabbb"]
//只捕获第一个小分组的内容
var str = 'aaabbb';
var reg = /(a+)(b+)/g;
var res = reg.exec(str);
console.log(res)
var str = '123aaa456';
var reg = /\d+/g; //只捕获一次,一次尽可能多的捕获
var res = str.match(reg)
console.log(res)
var str = 'abc123cba456aaa789';
var reg = /\d+/g;
console.log(reg.exec(str))
// console.log(str.match(reg));
// ["123", index: 3, input: "abc123cba456aaa789"];
console.log(reg.lastIndex)
// lastIndex : 0
console.log(reg.exec(str))
console.log(reg.lastIndex)
// exec
var str = '2017-01-05';
var reg = /-(\d+)/g
console.log(reg.exec(str));
// ["-01", "01", index: 4, input: "2017-01-05"]
// "-01" : 正则捕获到的内容
// "01" : 捕获到的字符串中的小分组中的内容
var str = '2017-01-05'
var reg = /-\d+/g
console.log(reg.exec(str)) // [ '-01', index: 4, input: '2017-01-05', groups: undefined ]
console.log(reg.exec(str)) // [ '-05', index: 7, input: '2017-01-05', groups: undefined ]
console.log(str.match(reg)) // [ '-01', '-05' ]
var str = '2017-01-06';
str = str.replace(/-\d+/g, function () {
console.log(arguments)
// return '!!!'
})
console.log(str);
var str = "I am singing and dancing"
var reg = /\w+(?=ing)/g
console.log(str.match(reg))
var reg = /\w+(?!ing)/g
console.log(str.match(reg))
var str = 'abc'
var reg = /a(?=b)c/
console.log(str.match(reg));
console.log(reg.test(str));
str = 'abc bbc cbc aba'
reg = /\w+(?!c)/g
console.log(str.match(reg))
var str = 'nodejs abjs ab as'
var reg = /\w+(?!js)/g
console.log(str.match(reg))
console.log(
'12345689.56'.match(/\d{2,3}/g)
) //
var str = 'dasf¥998asf@888we'
var reg = /(?<=@)\d+/
console.log(reg.exec(str)) //888
var reg = /(?<!@)\d+/
console.log(reg.exec(str)) //888
var s = "abcdefghijklmn";
var r = /(\w)(\w)(\w)/;
r.test(s);
console.log(RegExp.$1); //返回第1个子表达式匹配的字符a
console.log(RegExp.$2); //返回第2个子表达式匹配的字符b
console.log(RegExp.$3); //返回第3个子表达式匹配的字符c