js RegExp汇总

发布时间 2023-04-07 16:21:57作者: 王希有
// ----------  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