正则表达式题目

使用编辑器修改内容,在编辑器一般都有全局搜索功能,如使用正则表达式匹配会快速得多,比如下面例子

例子一: 将http下的jpg地址找出来 并去掉http

1
2
3
4
5
6
7
8
9
http:fdsfds/fdsf.jpg
https:fdsfds/fdsf.jpg
http:fdsfds/fdsf.png
http:fdsfds/fdsf.png
https:fdsfds/fdsf.jpg
http:fdsfds/fdsf.jpg
http:fdsfds/fdsf.png
https:fdsfds/fdsf.png
http:fdsfds/fdsf.png
  • 答案

    • http:(.+.jpg) 替换为 $1
  • 解释
    • () 标记一个子表达式的开始和结束位置。子表达式可以获取供以后使用。
    • . 匹配除换行符 \n 之外的任何单字符
      • 匹配前面的子表达式一次或多次
      • 匹配前面的子表达式零次或多次
    • \ 将下一个字符标记为或特殊字符、或原义字符、或向后引用、或八进制转义符。
    • $1 匹配第一个子表达式

例子二:将时间改为 “XXXX年XX月XX日”

1
2
3
4
5
6
2017/02/05
25435/04322/05325
2017-02-23
fds/dsa/05
12/02/05
2017-04-05
  • 答案

    • ^(\d{4})/-/-$ 替换为 $1年$2月$3日
  • 解释

    • \d 表示数字
    • {} 标记限定符表达式的开始结束
    • [] 标记一个中括号表达式的开始
    • ^ 表示匹配开始的位置
    • $ 表示匹配结束的位置

例子三:获取一个字符串中的数字字符,并按数组形式输出,如:dgfhfgh254bhku289fgdhdy675gfh,输出[254,289,675]

  • 答案

    1
    2
    3
    var str = 'dgfhfgh254bhku289fgdhdy675gfh';
    re = \/b+\g;
    str.match(re); // (3) ["254", "289", "675"]
  • 解释

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    var str = 'dgfhfgh254bhku289fgdhdy675gfh';
    var re = \/b\;
    str.match(re); // ["2", index: 7, input: "dgfhfgh254bhku289fgdhdy675"]
    再继续解决以上问题:全局遍历
    re = \/b\g;
    str.match(re); // (9) ["2", "5", "4", "2", "8", "9", "6", "7", "5"]
    再继续解决以上问题吧:连续出现至少一次以上
    re = \/b+\g;
    str.match(re); // (3) ["254", "289", "675"]

例子四:采用replace方法匹配

1
2
var req = new ReqExp('\\bis\\b','g')
"She is a girl.".replace(req,'IS') // She IS a girl.
  • 解释
    • g 是全局搜索
    • i 忽略大小写,默认不忽略大小写。以上例子没体现
    • 字符中之所以用两个反斜杠是为了保留之后的斜杠
1
'a1b2c3'.replace(/[abc]/g,'X'); // 'X1X2X3' 将 a 或 b 或 c 替换成X
  • 知识点 :在括号里 ^ 表示反字符串,也即是非
1
'a1b2c3'.replace(/[^abc]/g,'X'); // 'aXbXcX' 将不是 a 或 b 或 c 替换成X
  • 知识点 :范围类,比如[0-9] [a-z]
1
'a1b2c3'.replace(/[a-z]/g,'X'); // 'X1X2X3' 将 a 或 b 或 c 替换成X 获取非abc的

注:如果想要在[]里面匹配 - ,可以[0-9-]

1
'2007-01-02'.replace(/[0-9-]/g,'A'); // 'AAAAAAAAAA'

例子五:预定义类

1
2
3
4
'@123@abc@'.replace(/@./g,'Q'); // 'Q23Qbc@'
'@123@abc@'.replace(/^@./g,'Q'); // 'Q23@abc@'
'@123@abc@'.replace(/.@/g,'Q'); // '@12QabQ'
'@123@abc@'.replace(/.@$/g,'Q'); // '@123@abQ'
  • 知识点 :m 表示匹配换行符
1
2
3
4
5
6
7
8
9
var mulStr = "
@123
@456
@789
"
mulStr.replace(/@./gm,'Q')
//Q23
//Q56
//Q89

例子六:匹配范围尽可能多的匹配-贪婪匹配

1
'12345678'.replace(/\d{3,6}/,'X'); // 'X78'

例子七:匹配范围尽可能少的匹配-非贪婪匹配

1
'12345678'.replace(/\d{3,6}?/,'X'); // 'X45678'

例子八:分组匹配

1
2
'Abi123Abi4567Abi8'.replace(/Abi{3}/,'X'); // 匹配i连续出现3次
'Abi123Abi4567Abi8'.replace(/(Abi){3}/,'X'); // 用小括号将它分组 匹配Abi连续出现3次

例子九:反向引用,采用 $ 符号

1
'2015-02-01'.replace(/(\d{4})-(\d{2})-(\d{2})/g,'$2-$3-$1') // '02-01-2015'

例子十:前瞻,断言

1
'a2*3'.replace(/\w(?=\d)/g,'X'); \\ 'X2*3'

解释:(?=\d)这是断言部分,参与匹配,但不替换

例子十一:RegExp.prototype.test(str)

1
2
3
4
5
6
7
8
var reg1 = /\w/;
var reg2 = /\w/g;
reg2.test('ab'); // true
reg2.test('ab'); // true
reg2.test('ab'); // false
reg2.test('ab'); // true
reg2.test('ab'); // true

解释:出现以上结果不一致的原因是因为匹配后再执行一次,会从上一次执行的下一个位置开始。

1
2
3
4
5
6
var reg1 = /\w/;
var reg2 = /\w/g;
while(reg2.test('ab')) {
console.log(reg2.lastIndex) // 1 2
}
  • 知识点
方法 描述
exec 一个在字符串中执行查找匹配的RegExp方法,它返回一个数组(未匹配到则返回null)。
test 一个在字符串中测试是否匹配的RegExp方法,它返回true或false。
match 一个在字符串中执行查找匹配的String方法,它返回一个数组或者在未匹配到时返回null。
search 一个在字符串中测试匹配的String方法,它返回匹配到的位置索引,或者在失败时返回-1。
replace 一个在字符串中执行查找匹配的String方法,并且使用替换字符串替换掉匹配到的子字符串。
split 一个使用正则表达式或者一个固定字符串分隔一个字符串,并将分隔后的子字符串存储到数组中的String方法。

相关资料